- 博客(73)
- 收藏
- 关注
原创 RAG(检索增强生成)
当我们根据公司内的复杂文档开发一个项目的时候遇到一些问题我们直接去问大模型,大模型因为没有公司内相对应的文档数据所以它只会回答毫不相关的一些答案,这称之为“大模型出现了幻觉”,但当我们把问题和文档一起发送给大模型时,大模型就可以根据文档找出问题的解决答复数据但如果文档数据量很大的话大模型因为受限于接口接收数据量是不能接收的,这时Embedding模型的作用就显现出来了,我们先将文档切片,将切片数据一条条喂给Embedding大模型接着会产出一个固定长度的数组,接着将这些数据存储至专用的向量数据库。
2025-06-02 12:31:29
204
原创 逻辑过期策略+异步更新机制提高接口的高可用性的实践
并且数据爬取逻辑被多个线程冗余执行多次完全是没必要的(数据过期时只需要一个线程执行数据爬取逻辑更新缓存即可)。后端爬虫爬取数据缓存至Redis中,前端通过查询接口展现爬取数据。优化后,接口响应速度从。对于Redis中的过期数据我们可以使用。于Redis当中由于Redis是。,且它能保证缓存中的数据都是。的问题,提升用户体验。,显著提升了系统性能。将新闻爬取数据缓存至。
2025-03-16 16:57:37
305
原创 POI优化Excel录入
选择2*N的原因是代码中获取的核心数为物理核心数,而实际上主机可以利用超线程技术将一个物理核心当做两个逻辑核心来使用,当我们想让CPU利用率达到100%时就可以设置2*N个线程数并将单词分为2*N份交给线程池中的线程处理同时减少了线程的上下文切换所带来的损耗。首先获取当前主机核心数N,因为大数据量单词录入属于IO密集型所以我们设置线程池的大小为2*N第二步我选择将List拆分为2*N接着放入线程池当中去执行单词录入任务基于此线程池中的多个线程可以对数据的录入进行并发操作大大提高了录入的效率。
2025-02-18 17:46:04
400
原创 算法——反转字符串中的单词(leetcode151)
这道题有点难度我是在学习了别人的解题过程之后才对这道题的解法逐渐清晰,其实我刚入手这道题的时候我的想法就是先去除空格、然后反转整个字符串接着反转字符串里的每个单词即可我明白思路但却一直做不出来,原因就在于怎样合适的去除空格,以及去除空格后我们存在怎样合适的字符串数据类型当中,然后就是怎样处理每个单词的反转,由于上述原因导致我一直碰壁后来经过学习才发现大体方向是对的只要注意细节即可成功解开。通过这个条件我们可以使新的字符串中各个单词之间只有一个空格接着我们返回新的字符串即可。
2024-12-03 15:50:11
563
原创 算法——反转字符串二(leetcode541)
这道题是反转字符串的进阶版关键就在于怎样去反转字符串长度为k的这样一个区间以及尾部字符串的处理,刚开始我想着只用一个while循环内部用一些变量来控制反转字符串区间的移动但总处理不好,后直接使用for循环+while内部反转的方式来反转整个字符串,for循环就是控制字段串翻转的起始位置指针,反转的区间末尾指针需要根据题目条件去判断如果剩余字符少于k个时就要特殊赋值为字符串的末尾位置防止字符串组越界。反转字符串处理逻辑可以使用中间变量temp也可以使用异或运算来进行可借鉴字符串反转的思路。
2024-11-30 16:31:53
402
原创 算法——反转字符串(leetcode344)
对于这道题我上来先想到的是通过一个temp来作为容器不断交换字符串数组两端的字符即可随即当我对于三数之和愁眉苦展之时换了一道题我竟然能在leetcode上秒了一道没见过的题比两数之和要快的多(dog)但查看其他同学的解法我还发现了更为巧妙的解法作为学习‘位运算’根据异或运算的特性实现字符的交换(自反律、恒等律、交换律、结合律等等)输入字符串以字符数组。、使用 O(1) 的额外空间解决这一问题。异或运算交换两个变量的值而不使用额外的空间。不要给另外的数组分配额外的空间,你必须。
2024-11-30 00:25:19
192
原创 算法——赎金信(leetcode383)
magazine中的每个字符只能对应ransomNote中的一个字符,看到这道题我首先想到使用map来存储magazine每个字符出现的个数字符作为key值接着使用ransomNote遍历每个字符在map中查找并进行value的自减操作如果map中有元素的值小于0的话那就代表ransomNote不能由magazine组成故返回false否则遍历完毕后返回true但使用map虽然能将题目解出来但map涉及数组、链表以及红黑树的转换比较耗时和占用空间所以本题的优质解法可采用数组来解决;
2024-11-28 11:42:30
461
原创 算法——四数相加 二(leetcode454)
解析:这道题就是找到nums1和nums2、nums3、nums4不同元素之和为0的记录和,我看到这道题时首先是使用暴力解法去解决的但会被某些用例卡住超出时限,故暴力解法是不可行的其思想便是一遍遍遍历4个数组中的元素之和从0,0,0,0到n-1,n-1,n-1,n-1符合条件的便记录下来最后返回即可。1、利用Map来存储nums1和nums2数组元素之和以及数组元素之和出现的次数前者为key后者为value。2、遍历nums3,nums4数组元素之和取相反数来索引上述Map的value累加至res变量中。
2024-11-27 21:12:08
379
原创 算法——两数之和(leetcode1)梦开始的地方
分析题意可知我们选定一个数组元素时要再找到另一个不重复的元素两者之和要等于target并返回两个元素的下标由此除了暴力解法我们还可以想到Map的数据结构来存储元素key存储元素的值value存储元素的下标那么当我们遍历给定数组时只需要在Map中找到target-当前遍历的数组元素即可(同一元素不能重复使用)如果在Map中命中返回当前遍历的数组元素下标与Map的值即可。自己的解法(先将数组元素全部存储至Map中再索引Map并判断)整数,并返回它们的数组下标。,请你在该数组中找出。
2024-11-20 00:40:16
309
原创 算法——快乐数(leetcode202)
表明如果一个数不是快乐数那么它在后面的循环中是会重复出现之前的数字的所以每次我们得到平方和如果set中没有平方和的这个数则添加至set中否则直接返回false也就表明n不是快乐数;对于这道题我们只需按照题意每一次将该数替换为它每个位置上的数字的平方和并判断结果是否等于1如果等于1则n为快乐数否则继续循环,循环的终止条件在于题目上的。优质解法(时间复杂度O(logn))我的解法(时间复杂度O(N))编写一个算法来判断一个数。
2024-11-19 23:44:30
292
原创 算法——两个数组的交集(leetcode349)
4、遍历第二个数组找出元素值对应数组record下标的值是否大于0如果大于0就代表跟第一个数组中的元素重合也就是相交直接将元素值放入set中。2、将第一个数组遍历,在recored中将对应下标(遍历数组的元素值)+1此时record的值大于0的所有位置就存储了第一个数组中所有的值。对于这道题因为刚做过有效的字母异位词所以我还是想到用哈希表一个数组(数组下标代表题目给定数组元素的值)来解决这个问题。1、设定一个数组record因为数组元素的大小限制为0-1000共1001个元素故设置数组大小为1001。
2024-11-19 19:15:30
234
原创 算法——有效的字母异位词(leetcode242)
题目给定两个字符串判断这两个字符串是否是有效的字母异位词,这道题也就是判断重新排列字母组合时字母的种类和个数是否改变与原字母组合不同,因为字母一共有26个a~z对应的ASCLL码也是连续的所以我们可以使用哈希表的这种数据结构来解决这种问题,首先定义一个数组下标作为索引数组长度为26,我们无需关注字母的具体的ASCLL码的值只需让字母的ASCLL码减去'a'的ASCLL码即可让数组下标表示a~z;
2024-11-19 18:52:48
234
原创 并发学习小结一
五、了解并熟练使用线程的各种API如start、run、interrupt、sleep、join等等。八、interrupt在线程运行时与阻塞时(sleep、join、wait)打断的区别。三、了解操作系统层面的线程5种状态和Java中jdk线程状态显示的6种状态。二、学会进程查看终止、线程查看工具jconsole的使用。一、理解并发、并行和同步、异步的概念以及区别。四、学会线程创建的三种方式并理解它们的区别。十、线程上下文切换的原理与栈帧的详细图解。六、理解设计模式两阶段终止。
2024-11-19 16:29:41
248
原创 算法——环形链表(leetcode141)
来解决,首先令快慢指针fastIndex、slowIndex等于head头节点,接着来一个循环 循环体是fastIndex步进两个单位slowIndex步进一个单位判断如果slowIndex等于fastIndex则是有环 因为fastIndex走的比slowIndex快所以如果链表无环那么fastIndex肯定最先遍历至链表的末尾,故循环条件是(fastIndex!判断一个链表是否是环形链表,这题可以用。
2024-11-19 12:49:40
369
原创 算法——删除链表的倒数第N个节点(leetcode19)
总结:快慢指针中的fastIndex向后移动n+1个单位后那么slowIndex与fastIndex之间的间隔节点数是固定的所以当fastIndex指向null的时候slowIndex所指向的位置也就是从fastIndex开始往后数第n+1个节点的位置也就是删除节点的前一个位置这样就可以巧妙的删除节点了。6、令cur指向需要删除节点的后一个节点即可也就是cur.next=cur.next.next。2、定义快慢指针fastIndex、slowIndex指向虚拟节点。要删除的链表正数第m个节点的前一个节点)
2024-11-18 20:41:47
1234
1
原创 算法——链表相交(leetcode23)
null的时候p1、p2同时向后一个节点移动 如果p1等于null那么令p1指向链表B头结点接着同向移动即可,p2等于null时令p2指向链表A头结点,这样的话p1和p2在相交节点相遇之前走过的节点个数是相同的只要相交 p1必然会等于p2。也就是先遍历链表A和链表B的长度接着得到链表A和B长度的差值然后领长链表的指针指向差值后个节点此时链表A的指针与链表B的指针就同步了接着同步移动链表A指针p1和链表B指针p2即可直到p1==p2即找到相交节点返回即可。链表相交这题就是找出两个相交链表相交的节点并返回。
2024-11-18 15:29:44
387
原创 算法——反转链表(leetcode206)
对于这道题有两种方法第一种是双指针法,让指针pre指向节点为null指针cur指向头结点,通过temp临时变量存储cur的下一个节点的指针让cur.next=pre接着向后移动指针pre与指针cur也就是让pre=cur,cur=temp接着重复上述步骤遍历链表进行节点反转即可结束条件即为cur==null此时pre指向为头结点返回pre即可;反转链表顾名思义就是将链表每个节点的next指向逆转将尾节点变为头结点将头结点变为尾节点从而得到反转链表。
2024-11-14 10:10:18
370
原创 算法——移除链表元素(leetcode203)
移除链表元素简而言之就是将符合条件的链表节点给移除出去我们不能直接将其移除而是通过将被移除节点的上一个节点的指针指向被移除节点的下一个节点的地址就完成了链表元素的移除操作特别要注意的是java中是有内存回收机制的所以不需要手动释放节点而c++是需要的。移除链表元素首先我们要理解链表这种数据结构,它跟数组不一样它可以分布在内存中的各个位置链表节点由值和指针组成,指针指向下一个链表节点。方法一(单独处理头结点)
2024-11-13 20:40:04
300
原创 算法——螺旋矩阵II(leetcode59)
对于螺旋矩阵来讲难点主要在于行或列放置元素时的边界条件,我们遵循一个循环不变量原则在放置行或列元素时遵循左闭右开来放置元素这样就可以使代码简洁逻辑分明。代码逻辑简述就是根据正整数n确定循环圈数n/2在循环体中分别放置从左至右、从上到下、从右到左、从下到上的元素这样算完成一个循环圈数接着根据循环圈数重复上述操作即可要注意的是如果n为偶数则可以通过上述循环体将矩阵所有位置都放满元素如果是奇数那么就会导致矩阵正中心位置未放置元素这个我们需要在循环体外部进行单独判断处理这样就完成了上述螺旋矩阵的形成。
2024-11-13 15:32:29
358
原创 算法——长度最小的子数组(leetcode209)
双指针我们只需要使用一层for循环即可但要明确for循环中自增变量j的含义如果我们将j表示为起始位置的话那么求长度最小的子数组还是要遍历后续元素实质上和双层for循环是相似的所以我们将j定义为终止位置的指针,i表示起始位置的指针如果i至j这个子数组区间内的元素和大于等于目标值那么起始位置指针+1向右移动同时取符合条件的最小子数组的长度如此当for循环结束之后我们就可以得到长度最小的子数组长度并返回。
2024-11-13 10:21:56
349
原创 算法——有序数组的平方(leetcode977)
对于双指针解法来说由于给定的数组是非递减顺序的整数数组所以我们可以开辟一个新的数组(与给定数组等长)来存储平方后的元素我们给题目给定数组设置两个指针一个指向初始位置一个指向末端位置接着通过比较两个指针元素平方的大小将大的元素的平方放入我们新创建的数组索引末端位置如果相等则随意放入一个元素即可,放入后索引减1重复上述步骤直至原数组的一个指针越过另一个指针或者新数组放满为止输出数组即可。双指针解法来说时间复杂度较低(O(n))但空间复杂度因为创建新数组占用内存空间所以相对较高为O(N)组成的新数组,要求也按。
2024-11-12 21:16:59
286
原创 算法——移除元素(leetcode27)
我们利用两个指针一个指向数组首部位置(左指针)一个指向末端位置(右指针),如果首部位置所指元素与目标值相同则将右指针所指元素对左指针所指元素进行覆盖接着右指针向左移动如果不同则左指针向右移动重复上述步骤即可直至。对于移除元素这道题来讲,我首先想到的还是双指针,根据题目要求我们需要在给定的一组数组中找出。循环结束我们直接返回左指针下标即可(即为与目标值不同的元素数量总和)除此之外还有快慢指针法可以解决这个问题。这种方法比较正式的称呼是。
2024-11-12 15:56:48
335
原创 算法——二分查找(leetcode704)
接着通过数组的两端得到左指针和右指针继而得到中间指针指向数组中间元素,将中间元素与目标值比较如果大于目标值舍弃数组中间元素右边的一半将右指针重置为中间指针下标-1中间指针重置为左右指针下标之和除以2(如果中间元素与目标值比较小于目标值则舍弃数组中间元素左边的一半将左指针重置为中间指针下标+1)然后就得到剩下左右指针所包括的待对比数组元素重复上述步骤直至找出目标值或者左指针下标大于右指针下标即未找到目标元素。如下分别是左右指针数组边界左闭右闭和左闭右开两种情况的代码。
2024-11-12 15:27:47
276
原创 并发编程学习笔记-day02
1、多线程执行是依靠计算机的任务调度器来进行调度执行的 所以我们只能控制线程的启动而不能控制线程的执行而且计算 机系统会利用时间片来进行线程的上下文切换 2、如果电脑是单核CPU(现实中一般在虚拟机设置单核)多线程 会并发执行,执行时会导致CPU100%被占用会导致其他进程无法执行。1、线程执行时栈会给线程分配一块栈内存空间 2、线程执行方法时会给方法在线程栈内存空间内分配栈帧内存 3、一个线程只有一个活动栈帧 4、执行方法时成员变量存储在栈帧局部变量区中。会保存线程下一条指令执行的地址是。
2024-10-10 22:08:02
368
原创 排序算法分类及其稳定性
基准元素和末位元素交换元素,且首指针+1尾指针不变 若基准元素小于末位元素的话则元素不交换首指针不变尾指针+1直到基准元素将原数组分隔为1个或多个数组然后再在剩余的数组里面采用递归的形式实现快速排序。先通过数组底部两个相邻元素(Xi和X(i-1))的比较和交换接着比较(X(i-2)和X(i-1))依次进行i的自减比较直到得到最小或最大元素 将其移出比较数组移入排序数组即可。先选出排序码最小的元素然后移入排序数组接着在剩下的元素中选出排序码最小的元素依次进行可得到一个有序序列。1、直接选择排序 不稳定。
2024-10-10 07:55:30
554
原创 并发编程学习笔记-day01
的话那么多个线程一起执行和单个线程执行完三个任务的效率是差不多的,因为单核cpu的话线程并发执行是轮询执行的涉及到线程上下文切换所以。//获取线程返回结果,且task.get为等待状态,task.get()的执行完成时间等于线程的执行完成时间。的话那么线程的执行可以并行处理,处理时长取决于任务时间最长的那个线程最后再将累加所需时间加在一起便是任务完成的执行时间,new Thread(runnable,"t1").start//启动线程,t1为线程名称。Runnable是将代码块执行任务与线程分开的。
2024-10-10 00:03:42
369
原创 数据结构—堆
又由于完全二叉树的特性所以我们可以根据根节点的索引来找到其左右孩子节点 左孩子结点为根节点索引2倍 右孩子节点为2倍+1 如果通过孩子节点找父节点则可倒推。指每次取堆顶作为最大值或最小值和堆的最后一个元素做交换依次正序或倒序插入数组中然后消除已经交换的堆顶元素 接着对再次对堆进行建堆处理 再次取堆顶元素即可完成排序。大根堆就是二叉树及其子树的根节点大于等于其左右孩子节点。指的是非叶子节点二叉树子树向下依次调整为堆结构。堆首先它是一个完全二叉树,存储结构为数组。小根堆则是根节点小于等于其左右孩子节点。
2024-09-19 07:46:10
144
1
原创 Spring——Bean的生命周期
实现上述方法之后我们并不能直观的感受到Bean被销毁前的操作因为程序执行完后虚拟机就关闭力,IOC容器还没来得及关闭,所以我们要在虚拟机关闭前对容器进行关闭操作。其中Bean的实例化有四种方法、构造器实例化、静态工厂、实例工厂、实现FactoryBean接口。对于Bean的生命周期我们可以在Bean初始化之后、销毁之前对Bean进行控制。Bean的生命周期牵扯到Bean的实例化、属性赋值、初始化、销毁。1、调用close方法暴力关闭容器(直接关闭容器)1、在Bean的对象中写入初始化以及销毁的方法。
2024-08-18 16:48:50
184
原创 Spring——bean的基础配置以及四个实例化方法
通过测试程序可知Spring创建的Bean是单例bean这是因为bean的范围配置是在Bean标签中的scope属性配置的而singleton是默认设置为单例设置为prototype则bean为多例。如果对象的状态保持不变的话我们使用多例bean会牵扯的对象的不断创建这牵扯的cpu以及内存的消耗是非常没必要的所以我们使用单例bean需要时直接从容器中拿即可。一、Bean的基础配置包含Bean的别名(name)以及作用范围的配置(scope)使用单例bean和多例bean的基本原则。Controller层。
2024-08-18 16:32:55
278
原创 Spring——IOC/DI思想
当业务层需要数据层的对象时,IOC容器会帮我们对对象进行创建和初始化等一系列操作。,此时IOC容器的另一个作用就体现出来了,它会对有关系的对象进行依赖传递,将两个Bean绑定起来,此时。1、IOC(Inversion of Control)控制反转。既然在上面的IOC思想中我们已经把Bean交给容器去管理,数据层对象就会在IOC中创建出来并初始化给到业务层从而使。在业务层中我们如果要调用数据层的方法那么必然牵扯到。的问题,所以提出来IOC的思想,也就是将。的对象通一称为Bean。运行,这样就会存在一个。
2024-08-15 23:05:13
387
原创 算法——长度最小的子数组209 对比代码随想录题解中对于result取值为Integer.MAX_VALUE的思考
情况二:如果我们设置result=0的话,是不是在while处直接将result=j-i+1不就行了,然而提交之后是有用例错误的,后来经过思考我发现是我自己不够严谨,如果我们找到仅有一个符合要求的滑动窗口时那这样做应该是没错的,可问题是如果找到第二个及以上滑动窗口时且滑动窗口符合条件的子数组长度大于前面的滑动窗口时我们的result就变为一个更大的值了这不符合题目要求,所以我们需要通过一个。情况一:如果result为负数的话是不符合数组长度取值的一个规范的。具体解题过程可看代码随想录,我主要是对于。
2024-08-03 20:36:33
288
原创 Vue2一个正计时器的功能
这样一个功能,我们可以利用sessionStorage来存储我们进入网站的时间戳,每次刷新页面时判断sessionStorage是否有这个时间戳如果有则不对初试时间进行存储如果没有则存储时间戳,然后每次刷新页面时记录下当前时间戳与sessionStorage中的初试时间作一个减法可得到学习的时间,但这是的时间是不规范的是毫秒级别的 所以我们再对其进行一个格式化得到 小时(hour)、分钟(minute)、秒(second)接着修改start中他人的代码 将上述变量添加其中即可。
2024-07-14 14:23:36
655
2
原创 Java基础--AOP--通知类型
1、:方法执行前通知2、:方法执行前后通知3、:方法执行后通知,不管有没有抛出异常都会通知4、:方法成功执行后没有抛异常通知5、:方法执行异常时通知。
2024-06-23 21:46:20
563
1
原创 Redis——持久化RDB和AOF
上面包含了虚拟地址和物理地址的映射关系,当我们修改虚拟地址的数据时对应的物理地址的数据也会由于映射而改变,可如果只用主进程来执行RDB的话,会阻塞主进程的所有命令,所以我们通常采用bgsave来开启一个子进程执行RDB,AOF简单来说就是将每次的Redis命令记录到AOF文件中,相当于日志记录,当Redis实例宕机时,从磁盘读取AOF文件重新执行一次AOF中命令即可恢复数据,数据完整性较高,刷盘策略决定了AOF文件更新的频率。#指的是当AOF文件大于原来的150%时进行bgrewrite文件重写。
2024-06-19 01:34:56
589
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人