数据结构
文章平均质量分 58
杯酒问苍天
位卑未敢忘忧国
展开
-
[C++]位图+布隆过滤器
位图,就是用每一位(bit)来存放某种状态,适用于海量数据,数据无重复的场景。通常是用来判断某个数据存不存在的。如:数据是否在给定的整形数据中,结果是在或者不在,刚好是两种状态,那么可以使用一个二进制比特位来代表数据是否存在的信息,如果二进制比特位为1,代表存在,为0代表不存在。我们将每一个数据都以某种方式映射到位图中,那么一个位置就代表了其所对应的数据,一个数据只映射到其对应的位置中(一一对应)。原创 2024-07-14 17:21:44 · 339 阅读 · 0 评论 -
[C++]哈希
在顺序结构以及平衡树中,元素关键码(key)与其存储位置之间没有对应的关系,因此在查找一个元素时,必须要经过关键码(key)的多次比较。顺序查找时间复杂度为O(N),平衡树中为树的高度,即O(log2 N),搜索的效率取决于搜索过程中元素的比较次数。理想的搜索方法:可以不经过任何比较,一次直接从表中得到要搜索的元素。如果构造一种存储结构,通过某种函数(HashFunc)使元素的存储位置与它的关键码(key)之间能够建立一一映射的关系,那么在查找时通过该函数可以很快找到该元素。原创 2024-07-14 13:22:52 · 1005 阅读 · 0 评论 -
[C++]红黑树
红黑树,是一种二叉搜索树,但在每个结点上增加一个存储位表示结点的颜色,可以是Red或Black。 通过对任何一条从根到叶子的路径上各个结点着色方式的限制,红黑树确保没有一条路径会比其他路径长出俩倍,因而是接近平衡的。性质:每个结点不是红色就是黑色根节点是黑色的如果一个节点是红色的,则它的两个孩子结点是黑色的对于每个结点,从该结点到其所有后代叶结点的简单路径上,均 包含相同数目的黑色结点每个叶子结点都是黑色的(此处的叶子结点指的是空结点)原创 2024-05-29 12:50:53 · 714 阅读 · 0 评论 -
【C++】AVL树
AVL树是一种平衡的二叉搜索树,它的特点是任何节点的两个子树的高度最大差别为1,也就是说它是高度平衡的。AVL树的查找、插入和删除的时间复杂度都是O(log n),但是插入和删除可能需要通过旋转来调整树的结构。AVL树是两位俄罗斯的数学家G.M.Adelson-Velskii和E.M.Landis在1962年发明的,达到降低树的高度,从而减少平均搜索长度的目的。原创 2024-05-23 17:09:11 · 511 阅读 · 0 评论 -
[C++]二叉搜索树
对于二叉搜索树的插入操作,我们将需要插入的key值与当前结点(初始结点是root结点)比较,若小于该结点的值,则往左子树走;若大于该结点的值,则往右子树走。对于二叉搜索树的查找操作,我们将需要查找的key值与当前结点(初始结点是root结点)比较,若小于该结点的值,则往左子树走;若大于该结点的值,则往右子树走。若走到空,则说明没有这个值,返回空指针。若找到该值,则返回该值的结点。走到空结点的时候,那么这个位置就是这个key值的归宿。使用中序遍历二叉搜索树时,我们得到的是一个递增序列。原创 2024-02-18 22:04:18 · 453 阅读 · 0 评论 -
【数据结构】【堆】 堆排,TOPK问题
我们将堆顶数据与最后一个数据进行交换,然后把堆的最后一个位置排除在外(即它不参与后续的调整),对交换后的堆顶数据进行向下调整,如此,堆顶存放的就是次小的数据。每次取出磁盘(或其它地方)的数据与堆顶数据进行比较,比堆顶数据大就进堆,然后向下调整。注意:不能构建成大堆,因为当堆顶的数据是最大的数据时,其它数据都无法进入堆。我们重复以上过程,那么就能依次选出最小的,次小的,次次小的······要找到最大的k个数据,我们就需要构建一个K个容量的小堆。在构建好小堆后,堆顶的数据就是最小的。如果要排降序,就构建小堆。原创 2023-05-31 13:34:03 · 493 阅读 · 0 评论 -
[数据结构] 【C语言】循环队列实现
设计你的循环队列实现。循环队列是一种线性数据结构,其操作表现基于 FIFO(先进先出)原则并且队尾被连接在队首之后以形成一个循环。它也被称为“环形缓冲器”。循环队列的一个好处是我们可以利用这个队列之前用过的空间。在一个普通队列里,一旦一个队列满了,我们就不能插入下一个元素,即使在队列前面仍有空间。但是使用循环队列,我们能使用这些空间去存储新的值。原创 2023-05-20 22:13:04 · 92 阅读 · 0 评论 -
【数据结构】[LeetCode138. 复制带随机指针的链表]
给你一个长度为n的链表,每个节点包含一个额外增加的随机指针random,该指针可以指向链表中的任何节点或空节点。构造这个链表的。深拷贝应该正好由n个节点组成,其中每个新节点的值都设为其对应的原节点的值。新节点的next指针和random指针也都应指向复制链表中的新节点,并使原链表和复制链表中的这些指针能够表示相同的链表状态。。例如,如果原链表中有X和Y两个节点,其中。那么在复制链表中对应的两个节点x和y,同样有。返回复制链表的头节点。用一个由n个节点组成的链表来表示输入/输出中的链表。原创 2023-05-11 20:09:05 · 464 阅读 · 0 评论 -
【数据结构】[环形链表](LeetCode142. 环形链表 II)给定一个链表的头节点 head ,返回链表开始入环的第一个节点。 如果链表无环,则返回 null
给定一个链表的头节点head,返回链表开始入环的第一个节点。如果链表无环,则返回null。如果链表中有某个节点,可以通过连续跟踪next指针再次到达,则链表中存在环。为了表示给定链表中的环,评测系统内部使用整数pos来表示链表尾连接到链表中的位置(如果pos是-1,则在该链表中没有环。pos,仅仅是为了标识链表的实际情况。链表。原创 2023-05-11 18:47:12 · 335 阅读 · 0 评论 -
【数据结构】删除二叉树中的结点;树与二叉树的相互转换(含二叉树/二叉排序树的基本运算)
(1)首先判断要删除的结点是否存在,如果不存在则直接返回NULL。(2)如果要删除的结点小于当前结点,则递归删除左子树中的结点。(3)如果要删除的结点大于当前结点,则递归删除右子树中的结点。(4)如果要删除的结点等于当前结点,则分四种情况进行处理:情况1:要删除的结点是叶子结点,直接删除即可。情况2:要删除的结点只有右子树,将右子树替换当前结点即可。情况3:要删除的结点只有左子树,将左子树替换当前结点即可。情况4:要删除的结点既有左子树又有右子树,将右子树中的最小值替换当前结点即可。原创 2023-04-26 17:05:13 · 1494 阅读 · 0 评论 -
【数据结构】交换二叉树每个结点的左右子节点+计算二叉树的最大宽度等实现(C语言)
【数据结构】交换二叉树每个结点的左孩子和右孩子、计算二叉树的最大宽度、二叉树查找值为x的节点、二叉树深度/高度、二叉树第k层节点个数、二叉树叶子结点个数、二叉树节点个数、前序+中序+后序遍历原创 2023-04-05 16:09:31 · 457 阅读 · 0 评论 -
【数据结构】你真的认识“&”吗?它真的就只是“取地址”吗?或许你一直都在误解它。
注意,这里的&可不是表示取地址。如果你把它理解为取地址,那就在错误的路上狂奔,且一去不返了。相信大家在学习C语言时,也被指针折磨过不少。可能都出现过野指针等,这些失误让我们不胜其烦。其实,编写书籍的老师,使用“&”这个符号,就是为了减少指针的使用。“&”在这里,是C++中的“引用”。但是,这对于一些没有了解过相关语法的同志,那又成了一个坑。毕竟,C语言里面的“&”可是代表着“取地址”。那么,我们接下来就来好好说道说道,“&”到底是个什么东西。原创 2023-03-30 13:37:22 · 1830 阅读 · 0 评论 -
【C语言】【数据结构】循环队列实现(以带头节点的循环链表表示队列,并且只设一个指针指向队尾元素节点)
假设以带头节点的循环链表表示队列,并且只设一个指针指向队尾元素节点(注意:不设头指针) ,编写相应的置空队列、判断队列是否为空、入队和出队等。原创 2023-03-25 12:24:59 · 929 阅读 · 0 评论 -
【数据结构】顺序表中,如何实现接口:删除顺序表中所有值为item的数据元素,且时间复杂度为O(n),空间复杂度为O(1)
实现一个接口函数:删除顺序表中所有值为item的数据元素,且时间复杂度为O(n),空间复杂度为O(1)原创 2023-03-12 10:14:51 · 374 阅读 · 0 评论 -
【数据结构】单链表中,如何实现 将链表中所有结点的链接方向“原地”逆转
如何实现:将链表中所有结点的链接方向“原地”逆转,即要求仅利用原表的存储空间,换句话说,要求空间复杂度为O(1)原创 2023-03-11 16:56:45 · 2102 阅读 · 0 评论 -
快排变慢排?怎么个事儿?(快速排序非递归实现)
我们知道,快排是一种很好的排序算法。但是在极少数的一些情况下,“快速排序”好像名不副实了。比如:。。。。。这样的数列。这样,我们就得到了一个很可惜的结论:快排不是万金油。但是,这是指的的快排,我们可以写的快速排序,来看看是否能解决这个问题。原创 2023-07-13 21:09:39 · 529 阅读 · 0 评论 -
【C语言】【数据结构初阶】 选择排序 、快速排序(重点)- 详解
选择排序是一种简单直观的排序算法。它的工作原理是:第一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后再从剩余的未排序元素中寻找到最小(大)元素,然后放到已排序的序列的末尾。以此类推,直到全部待排序的数据元素的个数为零。我们可以对其做一个优化:我们一趟选择,同时选出最小的和最大的,而非只选出最小/最大的。但是选择排序的时间复杂度为O(n^2),最好情况下,也为O(n^2)原创 2023-01-26 20:49:10 · 352 阅读 · 2 评论 -
【C语言】【数据结构初阶】 插入排序 ,希尔排序 - 详解
插入排序是指在待排序的元素中,假设前面n-1(其中n>=2)个数已经是排好顺序的,现将第n个数插到前面已经排好的序列中,然后找到合适自己的位置,使得插入第n个数的这个序列也是排好顺序的。按照此法对所有元素进行插入,直到整个序列排为有序的过程,称为插入排序。原创 2023-01-26 12:37:49 · 508 阅读 · 0 评论