- 博客(188)
- 问答 (2)
- 收藏
- 关注
![](https://csdnimg.cn/release/blogv2/dist/pc/img/listFixedTop.png)
原创 什么是一致性哈希?
比如,上图中如果节点A被移除了,当节点A宕机后,根据一致性哈希算法的规则,其上数据应该全部迁移到相邻的节点B上,这样,节点B的数据量、访问量都会迅速增加很多倍,一旦新增的压力超过了节点B的处理能力上限,就会导致节点B崩溃,进而形成雪崩式的连锁反应。最简单的方式,引入一个中间的负载均衡层,让它将外界的请求轮流的转发给内部的集群。比如,当某个节点被移除时,对应该节点的多个虚拟节点均会被移除,而这些虚拟节点按顺时针方向的下一个虚拟节点,坑会对应不同的真实节点,即这些不同的真实节点共同分担了节点变化导致的压力。
2024-08-24 22:20:59
768
![](https://csdnimg.cn/release/blogv2/dist/pc/img/listFixedTop.png)
原创 哈希(Hash)
哈希也叫散列,因而哈希表也叫散列表。通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做哈希函数。采用散列函数将记录存储在一块连续的存储空间中,这块连续的存储空间称为哈希表。所得的存储地址称为哈希地址。
2024-08-20 21:22:20
992
![](https://csdnimg.cn/release/blogv2/dist/pc/img/listFixedTop.png)
原创 从编程语言到可执行程序
动态库还有另外的强大之处,那就是如果修改了动态库的代码,我们只需要重新编译动态库即可,而不需要重新编译依赖该动态库的程序,因为可执行文件当中仅仅保留了动态库的必要信息,只需要简单地用新的动态库替换原有动态库即可,下一次程序运行时就可以使用最新的动态库了。第一种场景,在程序加载时进行动态链接,这里的加载指的是可执行文件的加载,其实就是把可执行文件从磁盘搬到内存的过程,因为程序最终都是在内存中被执行的,系统中有一个特定的程序专门负责程序的加载,这个程序被称为加载器。动态库,又叫共享库、动态链接库等。
2024-08-19 16:16:30
1481
![](https://csdnimg.cn/release/blogv2/dist/pc/img/listFixedTop.png)
原创 C++11工作窃取式线程池
工作窃取式线程池采用了工作窃取算法,具体来说就是当某个线程执行完自己队列中的任务后,会从其他线程的队列中“偷取”任务来执行。这种算法可以提高线程利用率,减少线程之间的竞争,以及减小线程的等待时间。在同步队列中设计std::vector<std::list<T>>,使用该容器来存储任务,利用数组加链表,设置vector的大小为bucketsize,即一般为CPU核数,利用链表存放具体任务。
2024-08-15 21:34:58
749
![](https://csdnimg.cn/release/blogv2/dist/pc/img/listFixedTop.png)
原创 C++11缓存式线程池
动态调整线程数量:与固定式线程池不同,缓存式线程池的线程数量是动态调整的。当有新任务提交时,如果线程池中有空闲的线程,则会立即使用空闲线程执行任务;如果线程池中没有空闲线程,则会创建一个新的线程来执行任务。当线程空闲一段时间后,超过线程最大空闲时间(默认为60s),线程将会被回收和销毁。
2024-08-14 21:34:17
572
![](https://csdnimg.cn/release/blogv2/dist/pc/img/listFixedTop.png)
原创 C++11固定式线程池
除了void Take(T& x)接口,每次获取到锁后,只能获取一个数据,其实这时队列中可能有多条数据,如果每条数据都加锁获取,效率是很低的,这里做出改进,做到一次加锁就能将队列中所有数据都取出来,从而大大减少加锁的次数。ThreadPool中有3个成员变量,一个是线程组,这个线程组中的线程是预先创建的,应该创建多少个线程由外面传入,一般建议创建CPU核数的线程以达到最优的效率,线程组循环从同步队列中取出任务并执行,如果线程池为空,线程组将处于等待状态,等待任务的到来。
2024-08-13 21:49:40
419
![](https://csdnimg.cn/release/blogv2/dist/pc/img/listFixedTop.png)
原创 线程池概述
同步服务层则会不断地将新的任务添加到同步排队中,有可能上层的任务非常多,而任务又是非常耗时的,这时,异步层中的线程处理不过来,则同步排队层中的任务会不断增加,如果同步排队层不加上限控制,则可能会导致排队层中的任务过多,内存暴涨的问题。从活动图中可以看到线程池的活动过程,一开始线程池会启动一定数量的线程,这些线程属于异步层,主要用来并行处理排队层中的任务,如果排队层中的任务数为空,则这些线程等待任务的到来,如果发现排队层中有任务了,线程池则会从等待的这些线程中唤醒一个来处理新任务。
2024-08-12 21:27:22
886
原创 链表--随机链表复制
指针也都应指向复制链表中的新节点,并使原链表和复制链表中的这些指针能够表示相同的链表状态。节点组成,其中每个新节点的值都设为其对应的原节点的值。个节点组成的链表来表示输入/输出中的链表。的链表,每个节点包含一个额外增加的随机指针。,该指针可以指向链表中的任何节点或空节点。那么在复制链表中对应的两个节点。例如,如果原链表中有。返回复制链表的头节点。
2024-08-25 11:21:22
274
原创 栈--最小栈
-> 返回 -3.minStack.getMin();--> 返回 -2.minStack.top();操作,并能在常数时间内检索到最小元素的栈。
2024-08-24 16:19:39
185
原创 栈--简化路径
表示将目录切换到上一级(指向父目录);两者都可以是复杂相对路径的组成部分。任意多个连续的斜杠(即,,表示指向某一文件或目录的 Unix 风格。开头),请你将其转化为更加简洁的规范路径。对于此问题,任何其他格式的点(例如,在 Unix 风格的文件系统中,一个点()表示当前目录本身;多个连续的斜杠被单个斜杠替换。是此问题中目录的有效名称。)均被视为文件/目录名称。不可能从根目录上升级一级。
2024-08-24 15:59:13
274
原创 区间--合并区间
区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6].一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间。区间 [1,4] 和 [4,5] 可被视为重叠区间。表示若干个区间的集合,其中单个区间为。请你合并所有重叠的区间,并返回。
2024-08-23 15:05:32
129
原创 哈希表--最长连续序列
找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。最长数字连续序列是 [1, 2, 3, 4]。方法二:unordered_set。请你设计并实现时间复杂度为。给定一个未排序的整数数组。
2024-08-21 14:30:13
196
原创 矩阵--生命游戏
下一个状态是通过将上述规则同时应用于当前状态下的每个细胞所形成的,其中细胞的出生和死亡是同时发生的。个格子的面板,每一个格子都可以看成是一个细胞。,是英国数学家约翰·何顿·康威在 1970 年发明的细胞自动机。的当前状态,返回下一个状态。
2024-08-19 20:05:30
133
原创 矩阵--旋转图像
旋转图像,这意味着你需要直接修改输入的二维矩阵。请你将图像顺时针旋转 90 度。方法一:(测试只适用于3*3)使用另一个矩阵来旋转图像。
2024-08-18 14:48:07
387
原创 矩阵--有效的数独
以外,空格内其他数字均与 示例1 相同。但由于位于左上角的 3x3 宫内有两个 8 存在, 因此这个数独是无效的。,验证已经填入的数字是否有效即可。除了第一行的第一个数字从。
2024-08-18 12:53:52
351
原创 滑动窗口--无重复字符的最长子串
请你找出其中不含有重复字符的。请注意,你的答案必须是。因为无重复字符的最长子串是。因为无重复字符的最长子串是。因为无重复字符的最长子串是。,所以其长度为 3。,所以其长度为 1。,所以其长度为 3。
2024-08-17 16:04:26
177
原创 滑动窗口--长度最小的子数组
如果不存在符合条件的子数组,返回。是该条件下的长度最小的子数组。找出该数组中满足其总和大于等于。个正整数的数组和一个正整数。
2024-08-17 15:02:31
139
原创 力扣--三数之和
不同的三元组是 [-1,0,1] 和 [-1,-1,2]。注意,输出的顺序和三元组的顺序并不重要。答案中不可以包含重复的三元组。唯一可能的三元组和不为 0。唯一可能的三元组和为 0。,判断是否存在三元组。
2024-08-17 14:02:49
181
原创 力扣--环形链表
指针再次到达,则链表中存在环。为了表示给定链表中的环,评测系统内部使用整数。来表示链表尾连接到链表中的位置(索引从 0 开始)。如果链表中有某个节点,可以通过连续跟踪。链表中有一个环,其尾部连接到第二个节点。链表中有一个环,其尾部连接到第一个节点。仅仅是为了标识链表的实际情况。,判断链表中是否有环。给你一个链表的头节点。
2024-08-15 16:59:53
144
原创 力扣--两数之和
1 与 0 之和等于目标数 -1。因此 index1 = 1, index2 = 2。返回 [1, 2]。2 与 7 之和等于目标数 9。因此 index1 = 1, index2 = 2。返回 [1, 2]。2 与 4 之和等于目标数 6。因此 index1 = 1, index2 = 3。返回 [1, 3]。你所设计的解决方案必须只使用常量级的额外空间。,请你从数组中找出满足相加之和等于目标数。的形式返回这两个整数的下标。以长度为 2 的整数数组。重复使用相同的元素。
2024-08-15 16:43:57
283
原创 力扣--反转字符串中的单词
中可能会存在前导空格、尾随空格或者单词间的多个空格。返回的结果字符串中,单词间应当仅用单个空格分隔,且不包含任何额外的空格。如果两个单词间有多余的空格,反转后的字符串需要将单词间的空格减少到仅有一个。反转后的字符串中不能存在前导空格和尾随空格。中使用至少一个空格将字符串中的。之间用单个空格连接的结果字符串。是由非空格字符组成的字符串。
2024-08-13 13:46:10
174
原创 深拷贝与浅拷贝的区别
对于深拷贝和浅拷贝来说,深拷贝会将原有的内存空间复制一份,从而会有指针指向复制以后的内存空间,修改新对象或新的空间不会对原有对象或者空间造成影响。浅拷贝只是将指向内存空间的指针复制了一份,而不复制内存空间,继续指向原有的内存空间,新旧对象或者指针指向同一片内存空间。引用只是以别名的形式存在,实际并不占用内存空间。它共享的是引用变量的内存空间和地址。首先,谈一下引用变量的内存分配。
2024-08-12 15:16:20
196
原创 设计LRU缓存结构
3. set(key, value):将记录(key, value)插入该结构,如果关键字 key 已经存在,则变更其数据值 value,如果不存在,则向缓存中插入该组 key-value ,如果key-value的数量超过capacity,弹出最久未使用的key-value。3.返回的value都以字符串形式表达,如果是set,则会输出"null"来表示(不需要用户返回,系统会自动输出),方便观察。1.某个key的set或get操作一旦发生,则认为这个key的记录成了最常使用的,然后都会刷新缓存。
2024-08-10 17:14:15
457
原创 C++11智能指针--weak_ptr
弱引用指针weak_ptr是用来监视shared_ptr的生命周期,是shared_ptr的一个助手。weak_ptr没有重载操作符*和->,因为它不与shared_ptr共享指针,不能操作资源,主要是通过shared_ptr获得资源的检测权,它的构造不会增加引用计数,它的析构也不会减少引用计数,纯粹只是作为一个旁观者来监视shared_ptr中管理的资源是否存在。weak_ptr还可以用来返回this指针和解决循环引用的问题。
2024-08-04 18:46:02
309
原创 C++11智能指针--shared_ptr
同时shared_ptr使用经典的“引用计数”方法来管理对象资源,每个shared_ptr对象关联一个共享的引用计数。(2)当任何shared_ptr对象超出作用域时,则在其析构函数中,将与资源对象关联的引用计数减1.如果引用计数变为0,则表示没有其他shared_ptr对象与此资源对象关联,在这种情况下,它使用deleter删除器删除该资源对象。(1)当新的shared_ptr对象与资源对象的地址关联时,则在其构造函数中,将与此资源对象关联的引用计数加1.(5)在容器保存shared_ptr对象是安全。
2024-08-04 16:26:12
537
原创 C++11智能指针--unique_ptr
unique_ptr在要表达“专属所有权”的语义时使用,即unique_ptr指针永远拥有其指向的对象,所以unique_ptr是一个move_only类型,一个unique_ptr指针是无法被复制的,只能将所有权在两个unique_ptr指针之间转移,转移完成后原来的unque_ptr将被设为nullptr。(1)语义简单,即当你确定要使用的指针是不是被共享所有权的时候,认选unique_ptr独占式所有权,当确定要被共享的时候可以转换成shared_ptr;
2024-08-03 22:01:29
429
空空如也
信息学奥赛一本通1136,为什么运行会出问题呢
2022-04-17
这个为什么提交显示,格式错误
2022-03-19
TA创建的收藏夹 TA关注的收藏夹
TA关注的人