数据结构与算法
文章平均质量分 80
Nathaniel333
源码爱好者/java八股文总结者/AI爱好者
展开
-
排序算法专题
(代号A)移动到根元素的位置。如果不是特殊情况,则堆的性质被破坏。但这仅仅是由于A小于其某个子元素。于是,我们可以把A和这个子元素调换位置。如果A大于其所有子元素,则堆调整好了;否则,重复上述过程,A元素在树形结构中不断“下沉”,直到合适的位置,数组重新恢复堆的性质。上述过程一般称为“筛选”,方向显然是自上而下。转载 2023-10-30 15:51:48 · 39 阅读 · 0 评论 -
Trie树专题
又叫或,是一种多叉树结构。如下图:上图是一棵Trie树,表示了关键字集合{“a”, “to”, “tea”, “ted”, “ten”, “i”, “in”, “inn”}。每个节点的所有子节点包含的字符互不相同可以看出,Trie树的关键字一般都是字符串,而且Trie树把每个关键字保存在一条路径上,而不是一个结点中。另外,两个有公共前缀的关键字,在Trie树中前缀部分的路径相同,所以Trie树又叫做前缀树(Prefix Tree)。原创 2023-10-26 20:59:14 · 26 阅读 · 0 评论 -
快速排序算法专题
在算法设计中,我们引入分而治之的策略,称为分治算法,其本质就是将一个大规模的问题分解为若干个规模较小的相同子问题,分而治之。1.分解:将要解决的问题分解为若干个规模较小、相互独立、与原问题形式相同的子问题。2.治理:求解各个子问题。由于各个子问题与原问题形式相同,只是规模较小而已,而当子问题划分得足够小时,就可以用简单的方法解决。3.合并:按原问题的要求,将子问题的解逐层合并构成原问题的解。快速排序是比较快的排序方法。最糟情况。原创 2023-10-16 07:05:20 · 29 阅读 · 0 评论 -
堆,堆排序专题
删除操作的逻辑为,删除堆的根节点,将最后一个节点补到根节点位置,得到一颗不符合规则的堆。再对根节点进行向下冒泡,即如果父节点小于某一孩子或所有孩子,将元素值最大 的孩子与父节点交换。孩子上移,父节点下移,下移后与孩子重复该操作,直到比孩子都大或没有孩子。将元素插入最后一位,再进行向上冒泡,即如果父节点的值小于被插入的元素,父节点下移,被插入的元素上移。时间复杂度取决于树的高度h。而完全二叉树的树的高度为[logn+1]的上取整,删除操作向下冒泡,操作时间还是取决于树的高度,原创 2023-10-15 22:45:55 · 34 阅读 · 0 评论 -
力扣146:LRU缓存
本文使用HashMap和双向链表来实现LRU算法,原理如下图所示:其中:1.2.比如我要删除key为100的缓存项,那么根据HashMap的key快速找到100对应的node节点,然后在双向链表中将节点进行删除(修改前后Node的指针即可)。当然可以将双向链表替换为单链表(也能保存顺序),但是这样会有问题:1.到要删除的节点的前一个节点;2.;鉴于以上原因,所以不考虑使用单链表。原创 2023-10-15 19:53:23 · 246 阅读 · 0 评论 -
哈希表专题
哈希表也叫散列表,哈希表是一种数据结构,它提供了快速的插入操作和查找操作,无论哈希表总中有多少条数据,,所以在很多程序中都有使用哈希表,例如拼音检查器。哈希函数的作用是帮我们把非int的或者转化成int,可以用来做数组的下标。比如我们上面说的将学生的姓名作为或者,这是就需要哈希函数来完成。原创 2023-10-13 22:32:06 · 44 阅读 · 0 评论 -
Redis整数集合专题
而我们的整数集合(intset)可以做到使用较少的内存空间却达到和字典一样效率的实现,但也是前提的,集合中只能包含整型数据并且数量不能太多。整数集合最多能存多少个元素在 redis 中也是有体现的。也就是超过 512 个元素,或者向集合中添加了字符串或其他数据结构,redis 会将整数集合向字典结构进行转换。转载 2023-09-25 13:27:11 · 27 阅读 · 0 评论 -
Redis压缩列表专题
ziplist 为了节省内存,采用了紧凑的连续存储。所以在修改操作下并不能像一般的链表那么容易,需要从新分配新的内存,然后复制到新的空间。ziplist 是一个双向链表,可以在时间复杂度为O(1)从下头部、尾部进行pop或push。可能会出现连锁更新现象。其实使用中并没有直接操作这种数据结构,但是可以设置何种情况下使用它。可以在 Redis 的配置文件中进行设置。hash-max-ziplist-entries:hash 类型元素数量超过指定数据后时候。使用 hash 存储, 否则使用压缩表。转载 2023-09-25 10:30:17 · 30 阅读 · 0 评论 -
跳表数据结构专题
跳表的空间复杂度分析并不难,如果一个链表有 n 个结点,如果每两个结点抽取出一个结点建立索引的话,那么第一级索引的结点数大约就是 n/2,第二级索引的结点数大约为 n/4,以此类推第 m 级索引的节点数大约为 n/(2^m),我们可以看出来这是一个等比数列。当然,因为我们举的这个例子数据量很小,所以效率提升的不是特别明显,如果数据量非常大的时候,我们多建立几层索引,效率提升的将会非常的明显,感兴趣的可以自己试一下,这里我们就不举例子了。前面我们已经讲过了,链表的查询的时间复杂度为 O(n),那跳表的呢?转载 2023-09-25 08:13:07 · 37 阅读 · 0 评论 -
B-树专题
B树也称B-树,它是一颗多路平衡查找树。我们描述一颗B树时需要指定它的阶数,阶数表示了一个结点最多有多少个孩子结点,一般用字母m表示阶数。当m取2时,就是我们常见的二叉搜索树。一颗m阶的B树定义如下:1)2)根结点最少可以只有1个关键字。3)4)每个结点中的关键字都按照从小到大的顺序排列,每个关键字的左子树中的所有关键字都小于它,而右子树中的所有关键字都大于它。5)。我们将一个key和其对应的data称为一个记录。原创 2023-08-28 15:22:39 · 40 阅读 · 0 评论 -
B+树专题
一个m阶的B+树具有如下几个特征:有k个子树的(B树中是k-1个元素),,所有数据都保存在叶子节点。所有的中间节点元素都同时存在于子节点,在子节点元素中是最大(或最小)元素。上面的这颗树中,得出结论:根节点元素8是子节点2,5,8 的最大元素,;根节点元素15是子节点11,15 的最大元素,素;由于B+树的非叶子结点均不存储Data,所以与 B-树相比,同样大小的磁盘页,。,其余中间节点仅仅是索引,没有任何的数据关联。在数据库的(Clustered Index)中,。原创 2023-08-27 09:28:35 · 43 阅读 · 0 评论 -
红黑树专题
红黑树是一种,是一种高效的查找树。它是由 Rudolf Bayer 于1978年发明,在当时被称为对称二叉 B 树(symmetric binary B-trees)。后来,在1978年被 Leo J. Guibas 和 Robert Sedgewick 修改为如今的红黑树。红黑树具有良好的效率,它可在 O(logN) 时间内完成查找、增加、删除等操作。因此,红黑树在业界应用很广泛,比如。考虑到红黑树是一种被广泛应用的数据结构,所以我们很有必要去弄懂它。原创 2023-08-27 09:11:34 · 37 阅读 · 0 评论