![](https://img-blog.csdnimg.cn/direct/b57cb3eca1cd4f20a49732fbd32581da.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
数据结构
文章平均质量分 89
用c/c++语言模拟各种数据结构,适合新手打基础
稻草人敲代码
懒得写简介
展开
-
【高阶数据结构】跳表
所以,我们需要一种方案,使得有序链表中的层数不是固定的,且高层数的节点不能太多。越高层的指针指向的数据更远也更大,这样一来,查找某一个数据时就不用遍历整个链表了,而是通过指针(也称为索引)当然,由于是随机产生层数,最坏情况就是每个节点只有一层或者每个节点的层数都是节点的总数,这样查找等操作时间复杂度就退化到了O(N).,假设每个节点的层数是2,这样的跳表的时间复杂度查找、删除、添加的时间复杂度都是O(N)的。:每个节点的多个指针指向的值从大到小竖直排列,有效指针的数量就是节点的层数。整个有序链表的效率。原创 2024-07-05 09:57:49 · 639 阅读 · 0 评论 -
【高阶数据结构】B-数、B+树、B*树的原理
B树:有序数组+平衡多叉树B+树:有序数组链表+平衡多叉树B*树:一棵更丰满的,空间利用率更高的B+树。原创 2024-07-04 15:52:39 · 735 阅读 · 0 评论 -
【数据结构】哈希表的原理及其实现
哈希表类主要有两个模块需要实现,一个是节点类,还有一个是存储节点的容器。跟线性探测代码不一样的地方在于,拉链法的节点实际上是一个链表的头节点(桶)。值得注意的是,由于线性探测法的特性,删除一个元素之后可能会影响后续查找元素。造成哈希冲突的主要原因是,哈希表的大小是有限的,而输入的数据可能会非常多,因此不可能避免出现哈希冲突。于是,当我们发生哈希冲突时,不用去哈希表中找空位了,因为当前桶是一个单链表,插入元素时直接头插就好了。该文件封装实现了一个哈希表类,哈希函数是除留余数,解决哈希冲突的方法采用拉链法。原创 2024-05-26 16:02:15 · 960 阅读 · 1 评论 -
【数据结构】红黑树的原理及其实现
与AVL实现类似,红黑树的节点依旧有三个指针分别指向父节点、左孩子节点、右孩子节点。且有一个变量表示当前节点的颜色。初始默认是红色。为什么默认设置为红色呢?这是因为插入节点时,新节点一定与空叶子节点相邻。而根据红黑树的性质,空叶子节点的颜色是黑色,这就使得,如果新插入节点是黑色,那么每插入一次这条路径就一定会多出来一个黑色节点,即一定要调整。虽然新节点是红色也可能会需要调整,但影响会少很多。//键值对//颜色:_kv(kv),_col(RED)原创 2024-05-15 12:43:37 · 821 阅读 · 1 评论 -
AVL树的原理及其实现
回顾我们对于二叉搜索树的了解,二叉搜索树的效率跟树的高度成反比。而且,数据插入的随机性导致普通的二叉搜索树甚至可能退化成一条“单链表”,这样的结构查找起来时间复杂度直奔O(N),这无疑是我们不想看到的。我们希望,无论数据怎么插入,二叉搜索树的结构都应该保持平衡,即看起来更加接近于完全二叉树或者满二叉树AVL树因此诞生。原创 2024-05-10 13:49:05 · 1185 阅读 · 15 评论 -
【数据结构】二叉搜索树的原理及其实现
越低意味着整棵树越像完全二叉树,查找的效率也就越高。越高意味着越像单支树,查找的效率也就越低。为了保持二叉搜索树的性能,也就衍生出了AVL树和红黑树。无论是插入操作还是查找操作的时间复杂度都取决于查找的时间效率,也就意味着,查找的效率极大程度上体现一颗二叉搜索树的性能。我们很容易想到,对二叉搜索树进行中序遍历就可以得到一个节点值递增的序列。二叉搜索树的应用其实非常广泛,像我们经常用的map,set等容器,底层其实就是一个二叉搜索树。根据二叉搜索树的性质,左节点的值 < 根节点的值 < 右节点的值。原创 2024-04-26 10:37:15 · 1048 阅读 · 2 评论 -
常见排序算法及其稳定性分析
排序算法可以说是每一个程序员在学习数据结构和算法时必须要掌握的知识点,同样也是面试过程中可能会遇到的问题,在早些年甚至还会考冒泡排序。由此可见呢,掌握一些常见的排序算法是一个程序员的基本素养。虽然现在的语言标准库里都有直接的排序函数,但是作为一个学习者,我们应当抱着“知其然,还要知其所以然”的态度去学习。1.常见的排序算法有哪些?原创 2024-01-06 23:08:55 · 1282 阅读 · 2 评论 -
解决top-k问题--堆排序
堆排序将堆的根节点与最后一个节点交换,然后将堆的大小减1,并进行堆的重构。max1>max2,a[i]>max2,所以此时的max2的值已经不是这个数组次大的了。被淘汰说明有前k个数大于自己,加入top-k说明此时的a[i]至少大于目前的maxk。,如果大于此时的maxk,说明就目前来说,a[i]有资格进入这前k大的数,通常的做法是用一个变量max1依次去比较数组中的每一个数,并更新。,它的每个节点的值都大于等于(或小于等于)它的子节点的值。先把此时的maxk的值去掉,算上a[i]之后调整这k个数。原创 2023-12-03 22:15:55 · 240 阅读 · 5 评论 -
二叉树详讲(一)---完全二叉树、满二叉树、堆
二叉树是一棵空树,或者是一棵由一个根节点和两棵互不相交的,分别称作根的左子树和右子树组成的非空树;左子树和右子树又同样都是二叉树。上图是一颗二叉树,有根节点,和其左右子树组成其实任何一棵二叉树的组成都由这样的根节点、左右子树组成,左右子树可能为空。任何一棵二叉树都由一下几种情况复合而成值得注意的是,美国及其国际上关于满二叉树的定义与国内是不一样的。美国NIST定义满二叉树是满二叉树的节点度数要么为0,要么为2.国际上认为上图也是满二叉树,但是不符合国内定义的满二叉树。原创 2023-11-25 23:26:55 · 354 阅读 · 11 评论 -
设计循环队列,解决假溢出问题
当我们使用队列这种基本的数据结构时,很容易发现,随着入队和出队操作的不断进行,队列的数据区域不断地偏向队尾方向移动。当我们的队尾指针指向了队列之外的区域时,我们就不能再进行入队操作了,而此时由于队头已经偏离原来位置,也就意味着实际上队列并没有满。这种实际上还有空间,但是却发生了溢出的现象就称为假溢出现象。原创 2023-11-22 21:35:31 · 1418 阅读 · 6 评论 -
纯c语言模拟栈和队列(初学必看)
栈是一种特殊的线性表,在栈这个结构里,越先存进去的数据越难取出来。这个结构就像是一个只有一端有打开的容器,越先放进去的球越在底部,想要把底部的球拿出来,就必须先把前面的求拿出来。像这种”先进后出“的结构就是栈。对于栈来说,我们只能在表尾进行插入或者删除,表。原创 2023-11-13 20:09:19 · 821 阅读 · 7 评论 -
带头+双向+循环链表
前面我们已经学习了单链表的结构及其功能特点,也了解了单链表在实现一些功能时出现的一些缺点,比如在删除某个节点前面一个节点时就需要再开一个变量来存放前面一个节点的信息,这样就显得不灵活,为了使链表实现功能更加灵活,我给来介绍带头双向循环链表,这种链表可以看成是单链表的升级版。带头链表意味着在链表头部添加一个空的头结点,这个头结点不包含数据,仅包含指向链表首尾结点的指针,它主要作用是。,并且头节点的前驱指针指向尾节点,尾节点的后驱指针指向头节点,这样整个链表就形成了一个环状结构,###test1运行结果。原创 2023-11-09 16:36:14 · 475 阅读 · 12 评论 -
链表详讲(附代码)
根据链表的优点,我们可以在频繁插入、删除操作但不需要随机访问和查找元素时使用这种数据结构。例如,在计算机科学中,许多常见问题,如哈希表、图、堆栈、队列等,都可以使用链表作为基础数据结构来实现。原创 2023-11-04 17:54:17 · 198 阅读 · 8 评论 -
顺序表的模拟
顺序表是一种线性数据结构,而且其存储数据的空间是连续的,这一点跟数组非常像。由于其基本结构式是连续的,我们在查找元素时也就可以用下标映射快速定位到元素的位置,是编写常见算法的常用数据结构之一。学数据结构一般都是从顺序表开始的,顺序表虽然简单,但是是我们经常使用的一种数据结构,了解并学会顺序表功能的具体实现对以后学习高级数据结构打下基础。总之,对于简单的知识我们要不能轻视,反而要更加重视对于基础的巩固,万丈高楼平地起嘛!原创 2023-10-30 23:17:36 · 486 阅读 · 5 评论