数据结构与算法
文章平均质量分 71
数据结构与算法
帅大大的架构之路
坚持!努力!奋斗!
展开
-
ETCD的Raft一致性算法原理
关于Raft的文章很多,本文是参考了很多的文章之后,总结出来的,写的不对之处欢迎赐教。1、Raft在对应的任期中每次只有一个leader产生,通过候选超时算法,保证了在大多数只有一个leader被选出的情况;2、所有的数据都是从leader流向follower中,通过日志的复制确认机制,保证绝大多数的follower都能同步到消息;3、当然,raft对于分布式中出现的各种安全性问题也做了兼容;4、不过真正实现一个生产级别的Raft算法库,需要考虑的东西还是很多,这里主要分析了几个主要的问题。转载 2024-01-30 14:01:32 · 146 阅读 · 0 评论 -
缓存滑动窗口的应用场景及实现
在Etcd中,为了解决滑动窗口的丢失历史事件的问题,可以通过缓存滑动窗口来保证历史事件不会丢失。具体而言,可以将滑动窗口中的历史事件记录到一个缓存中,当滑动窗口滑动到一定程度时,将缓存中的历史事件写入到磁盘中进行持久化存储。中添加事件时,会先将事件添加到普通的滑动窗口中,再将事件添加到缓存中。当缓存满了之后,会将缓存中的历史事件写入磁盘中,并重置游标。这样做的优点是可以保证历史事件的可靠性,同时也能够降低内存占用。,缓存滑动窗口的实现可能会增加代码的复杂性和运行时的开销,需要根据具体场景进行权衡。原创 2023-05-16 09:59:04 · 199 阅读 · 0 评论 -
堆和链表的demo
【代码】堆和链表的demo。原创 2023-05-15 14:35:58 · 72 阅读 · 0 评论 -
“滑动窗口”算法详解
(3)此时,我们停止增加 end,转而不断增加 start指针缩小窗口 [strat, end],直到窗口中的字符串不再符合要求(不包 所给字符串 中的所有字符了)。 简而言之,滑动窗口算法在一个特定大小的字符串或数组上进行操作,而不在整个字符串和数组上操作,这样就降低了问题的复杂度,从而也达到降低了循环的嵌套深度。 (2)我们先不断地增加 end指针扩大窗口 [strat, end],直到窗口中的字符串符合要求(包含了 所给字符串中的所有字符)。 我们可以看到。转载 2023-05-16 09:46:35 · 185 阅读 · 0 评论 -
【数据结构】八种常见数据结构介绍
等,这些数据结构在二叉树的基础上衍生了很多的功能,在实际应用中广泛用到,例如mysql的数据库索引结构用的就是B+树,还有HashMap的底层源码中用到了红黑树。二叉树是一种比较有用的折中方案,它添加,删除元素都很快,并且在查找方面也有很多的算法优化,所以,二叉树既有链表的好处,也有数组的好处,是两者的优化方案,在处理大批量的动态数据方面非常有用。因此,我们将Joe的数据存进数组的3号箱子中。链表是物理存储单元上非连续的、非顺序的存储结构,数据元素的逻辑顺序是通过链表的指针地址实现,每个元素包含两个结点,转载 2022-12-14 16:42:25 · 725 阅读 · 0 评论 -
什么是原码、反码和补码
原文一个数在计算机中的表示形式是二进制的话,这个数其实就叫机器数。机器数通常是带有符号的(指有正数和负数之分),计算机用最高位存放符号,这个 bit 一般叫做符号位。 正数的符号位为 0, 负数的符号位为 1。比如,十进制中的数 +7 ,计算机字长为8位,转换成二进制就是 0 0 0 0 0 1 1 1(一个 byte 有 8bit,有效的取值范围是 -128 ~ +127)。如果是 -7 ,就是 1 0 0 0 0 1 1 1 。一个存储的二进制码分原码、反码、补码,下面我们就来介绍一下什么是原码、反码、转载 2022-12-08 11:41:09 · 559 阅读 · 0 评论 -
进制对照表及转换规则
进制对照表原创 2022-12-07 13:57:34 · 11425 阅读 · 0 评论 -
十大经典排序算法(动图演示)
它的工作原理:首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。桶排序最好情况下使用线性时间O(n),桶排序的时间复杂度,取决与对各个桶之间数据进行排序的时间复杂度,因为其它部分的时间复杂度都为O(n)。很显然,桶划分的越小,各个桶之间的数据越少,排序所用的时间也会越少。计数排序是一个稳定的排序算法。和选择排序一样,归并排序的性能不受输入数据的影响,但表现比选择排序好的多,因为始终都是O(nlogn)的时间复杂度。转载 2022-10-08 10:26:11 · 164 阅读 · 0 评论 -
全网最全 数据结构 代码
分析:首先,我们要搞明白,原始的算法为啥这么慢呢?因为它在一遍一遍的遍历s和t,做了很多重复工作,浪费了一些我们本该知道的信息。大大降低了效率。比如t长度为10,s匹配到位置5,如果t一直匹配到了t[8],到[9]才匹配错误,那s已经匹配到了位置14,下一步怎么做呢?接着从位置6开始,和t[0]开始匹配,而s位置6和t[0]甚至后面很大一部分信息我们其实都遍历过,都知道了,原始算法却还要重复匹配这些位置。所以效率极低。转载 2022-07-22 16:58:36 · 556 阅读 · 0 评论