数据结构
文章平均质量分 59
包含数据结构的知识以及实现
超超同学
个人比较热爱编程,平时也会分享一些经典题型,也希望大佬指出不足之处,之后改进
展开
-
模拟实现B树的
这个一定要注意一下。第一种就是,不管此时的这个要提取中位数的节点是他父节点的左孩子还是右孩子,我们直接把中位数提取到父亲节点,也不需要排序,直接插入到父节点的最后一位置,然后此时重点来了,没错,大概是插入排序,是的,我们在这里用一个插入排序的思想,这里就会很方便。首先在这里说一下,B树其实与其他数据结构的实现有所不同,其他数据结构实现的时候,我们只需要按我们自己的思路,写下来,或许中间有几个bug,一改就好,但是B树是不同的,B树是先把大体思想的框架写出来,再根据往里插入的数据来修改bug。原创 2024-03-07 00:37:04 · 373 阅读 · 0 评论 -
B树系列(详解)
因为我们用B树的时候,B树的每个节点的所存储的关键字数量比AVL,红黑树等数据结构要多,所以他每次进行IO 的时候,就可以一次读取多个关键子和孩子所指向的文件数据块。且B树的每个节点的m一般系统会设置成1024,至于为什么,深入了解过文件系统的伙伴大概知道(这里我自己也是看到过网上有人说,至于原因,个人了解的也不太清楚,好像是跟文件系统的什么大小有关来着,也是1024,知道的伙伴可以说一下),这样就大大减少了B树的高度,最差情况下,也是进行高度次IO,而此时的IO次数最多也就是4次。有了代码就好理解了。原创 2024-03-02 00:10:09 · 1306 阅读 · 1 评论 -
哈希表的实现(哈希捅)
如上,它的原理其实就是这样的,而哈希捅的实现其实使用链表来实现的,也就是每个桶都挂了一个单向链表,其实不仅可以挂单向链表,双向链表其实也可以挂,但是不用双向链表的原因是,双向链表比单链表的消耗大,所以才用的单链表,而在同一个桶的位置,挂数的时候,我们普遍用头插,这个就不说了,很容易理解,头插的时间复杂度是O(1)。上面就是我用哈希捅实现的哈希表,思维逻辑还是比较简单的,但是还是要注意的点。还有就是线性探测与二次探测的方法来实现哈希表,这个后面会陆续的发。本篇内容如果对你有用的话,希望带你一下赞吧!原创 2023-09-10 16:24:28 · 155 阅读 · 0 评论 -
手撕红黑树
其实AVL树和红黑树两个各有各的好处,是的,个人认为两个各有各的好处,因为AVL对树高比较严格,所以导致旋转点额次数就多,所以就会有额外的消耗,但是红黑树就没有这么多的消耗了,因为红黑树的上面几个规则,导致红黑树最长路径不得超过对短路径的两倍,所以,红黑树也会旋转,但是插入同等节点的条件下,红黑树旋转点次数肯定比AVL树少,但是AVL树是严格的logn,而红黑树是不太严格的logn,所以我说是各有各的好。如果不是,就把新插入的节点更新成祖父节点,依次往上更新,直到父节点为空或是父节点的颜色为黑色就停止。原创 2023-09-03 18:54:57 · 473 阅读 · 4 评论 -
手撕二叉平衡树
如上图,如果没有插入100,那么此时的二叉平衡树是平衡的,但是此时如果插入100,此时30这个节点的平衡因子是2,所以此时需要旋转来降低这棵树的高度,此时就是左旋。和左单旋一样,因为新插入的节点导致30这个节点的平衡因子为-2,所以此时就要旋转来降低这棵树的高度,此时是要右旋,这个和左旋一样,30是旋转点,25进行右旋,把25这个节点的右子树连接到30这个节点的左子树处就可以了。先把60当旋转点进行旋转,再把30当旋转点进行旋转,至于子树怎么连接,与先左旋,在右旋相同。2.链接parent指针。原创 2023-09-03 11:54:28 · 551 阅读 · 3 评论 -
堆(堆排序以及TOPK问题)
大家想想,如果是小堆的话,要想排成升序,就必须要取堆顶的数据,取之后要删除数据,就在删除这出现了问题,有什么问题呢?所以我们建立大堆,大堆对顶的数据肯定是最大的,所以我们把堆顶的数据与数组中最后的一个元素交换,然后向下调整就好。其实堆的概念是建立在完全二叉树的基础上的,简单来说,堆就是父亲节点的值大于等于孩子节点(或是小于等于)。大家可以想一下,如果前k个元素中存在这个数据的最大的值,那么此时建立的大堆,对顶就是最大的值,这样的话就无法让次大值入堆了,所以要建立成小堆。以上就是堆排序的实现,原理很简单。原创 2023-05-06 14:42:11 · 86 阅读 · 5 评论 -
平衡二叉树的实现(包含旋转)
我们知道,在学时间复杂度的时候,我们一般都是根据最坏的结果来计算的,那么,它的最差的时间复杂度用大O表法,是不是就是O(n),但是如果这是一个平衡二叉树的话,那么,这个平衡二叉树的搜索时间就是O(log n)。好了,旋转的思想给大家说完,那么就是代码了,上面的代码是调试的时候可以清楚的看到,但是唯一不好的地方在于必须提前把最小不平衡子树找到,然后传入不平衡节点的地址,还有找到他的前驱,以方便旋转完成之后继续衔接。注意的是旋转的节点如果有左子树或是右子树,我们应该提前保存它,旋转之后在插入。原创 2023-04-28 13:07:03 · 421 阅读 · 0 评论 -
二叉排序树
什么事二叉排序树呢?简单来说就是左节点小于根节点小于右节点。我们可以看图来理解,如下:看上面的图,这个是一个简单的二叉排序树(也叫二叉搜索树),它遵循左节点小于根节点小于右节点,所以,我们再用这种树来搜索某一个节点时,是非常方便的,较普通二叉树的遍历来说,大大提高了我们的查找某一个数的效率。而大家想一个问题,那就是,它的时间复杂度到底是多少呢?(这里不考虑平衡二叉树的情况)。如果条件说这个二叉排序树的高度最小,节点最多的情况下,此时的时间复杂度是O(logn),因为此时如果节点最多,高度最小,说明此原创 2023-04-21 15:37:48 · 252 阅读 · 1 评论 -
线索二叉树(前序,中序,后序线索化以及遍历)
其次,就是写函数的那个文件了,我先写的是前序线索化二叉树,但是在这里我先给大家说一下中序线索化二叉树,因为前序线索化二叉树有坑,先说中序线索化二叉树。其次就是前序和中序线索化完之后,因为pre这个指针一定在树的最右面的那个节点,所以此时pre->right一定会是NULL,这个是因为我们在创建二叉树的时候,停止生成左右孩子的时候,我们就把这个节点赋值成了NULL,但是在线索化二叉树中,空指针就应该是指向的线索,所以此时我们不要多此一举,直接在他线索化完之后,直接就把他的右标记域改成1就好。原创 2023-04-16 00:25:08 · 729 阅读 · 12 评论 -
二叉树的实现(C语言版)
首先,要写二叉树的话必不可少的是要知道二叉树的存储结构,他是一个非线性的结构,但是我们可以根据图来看,很容易就能理解的是二叉树像是一种递归的结构,所以创建他的时候我们就用递归来创建,首先,先创建一个二叉树节点的指针,使他指向是这个二叉树的根节点,此时我们就可以创建了,因为是递归性质,所以我们不能无限的递归下去,要有限制条件,而且使他越来越接近这个递归条件,所以我用了ret这个变量来控制他的递归,选择条件是0或1,1是继续生成,0则是取消。前序:先是访问根节点,在左子树,最后是右子树,中序:左,根,右。原创 2023-04-12 22:57:58 · 1029 阅读 · 12 评论 -
KMP算法的讲解以及模拟实现字符串函数strstr
strstr的实现:这个函数其实有两种实现的方法:第一:就是我们口中的遍历,也就是暴力求解,这个方法没什么好说的,就是刚刚上面我说的思想。第二:就是高级一点的kmp算法了,这个算法的实现运用到了前面的顺序表和串的存储,要建立顺序表,还要把串存储到顺序表中,还要建立一个整数类型的数组,用来存放的是模式串中第几个字符匹配失败的时候,应该返回到第几个字符,然后重新进行比较(个人感觉这个方法是有点麻烦的,虽然比遍历效率要高),个人感觉这个方法真正体现了运用空间换时间的这个思维。原创 2023-03-13 17:19:09 · 121 阅读 · 5 评论 -
实现后缀表达式的求值
实现后缀表达式求值原创 2023-03-07 10:38:22 · 534 阅读 · 8 评论 -
顺序表以及链表的应用及区别(包含OJ讲解)
顺序表以及链表的应用及区别(包含OJ讲解)原创 2023-03-06 15:55:47 · 878 阅读 · 8 评论 -
特殊矩阵的存储
特殊矩阵的存储原创 2023-03-02 16:37:57 · 57 阅读 · 4 评论 -
前,中,后缀的概念以及转化
前后缀的概念以及转化原创 2023-02-25 18:52:50 · 184 阅读 · 4 评论 -
链表以及顺序表的区分
链表以及顺序表的区分原创 2023-02-20 22:35:46 · 107 阅读 · 1 评论 -
顺序表(动态顺序表)
顺序表原创 2023-02-09 20:32:54 · 94 阅读 · 2 评论 -
大O表示法(时间复杂度和空间复杂度)
大O表示法原创 2023-02-01 20:42:51 · 413 阅读 · 0 评论 -
链表(以及对应的接口函数)
链表的实现原创 2023-02-19 22:38:36 · 90 阅读 · 5 评论