
数据结构
文章平均质量分 77
五花肉村长
流水不争先,争的是滔滔不绝。
展开
-
C++ 哈希表封装unordered_map 和 unordered_set
SGI-STL30版本源代码中没有unordered_map和unordered_set,SGI-STL30版本是C++11之前的STL 版本,这两个容器是C++11之后才更新的。但是SGI-STL30实现了哈希表,只容器的名字是hash_map 和hash_set,他是作为⾮标准的容器出现的,⾮标准是指⾮C++标准规定必须实现的,源代码在 hash_map/hash_set/stl_hash_map/stl_hash_set/stl_hashtable.h中。原创 2024-12-17 20:32:50 · 717 阅读 · 0 评论 -
C++ 哈希表的实现
哈希(hash)⼜称散列,是⼀种组织数据的⽅式。从译名来看,有散乱排列的意思。本质就是通过哈希 函数把关键字Key跟存储位置建⽴⼀个映射关系,查找时通过这个哈希函数计算出Key存储的位置,进 ⾏快速查找。原创 2024-12-11 20:52:38 · 968 阅读 · 0 评论 -
C++ unordered_map和unordered_set的使用
• unordered_set的声明如下,Key就是unordered_set底层关键字的类型• unordered_set默认要求Key⽀持转换为整形,如果不⽀持或者想按⾃⼰的需求⾛可以⾃⾏实现⽀ 持将Key转成整形的仿函数传给第⼆个模板参数• unordered_set默认要求Key⽀持⽐较相等,如果不⽀持或者想按⾃⼰的需求⾛可以⾃⾏实现⽀持 将Key⽐较相等的仿函数传给第三个模板参数。原创 2024-12-10 21:34:55 · 843 阅读 · 0 评论 -
C++ 红黑树封装实现myset 和mymap
SGI-STL30版本源代码,map和set的源代码在map/set/stl_map.h/stl_set.h/stl_tree.h等⼏个头⽂件 中。map和set的实现结构框架核⼼部分截取出来如下:• 通过下图对框架的分析,我们可以看到源码中rb_tree⽤了⼀个巧妙的泛型思想实现,rb_tree是实 现key的搜索场景,还是key/value的搜索场景不是直接写死的,⽽是由第⼆个模板参数Value决定 _rb_tree_node中存储的数据类型。原创 2024-12-10 14:59:45 · 807 阅读 · 0 评论 -
C++ 红黑树
红⿊树是⼀棵⼆叉搜索树,他的每个结点增加⼀个存储位来表⽰结点的颜⾊,可以是红⾊或者⿊⾊。通过对任何⼀条从根到叶⼦的路径上各个结点的颜⾊进⾏约束,红⿊树确保没有⼀条路径会⽐其他路 径⻓出2倍,因⽽是接近平衡的。原创 2024-12-09 20:31:57 · 1119 阅读 · 0 评论 -
C++ AVL树
• AVL树是最先发明的⾃平衡⼆叉查找树,AVL是⼀颗空树,或者具备下列性质的⼆叉搜索树:它的 左右⼦树都是AVL树,且左右⼦树的⾼度差的绝对值不超过1。AVL树是⼀颗⾼度平衡搜索⼆叉树, 通过控制⾼度差去控制平衡。• AVL树得名于它的发明者G.M.Adelson-Velsky和E.M.Landis是两个前苏联的科学家,他们在1962 年的论⽂《An algorithm for the organization of information》中发表了它。原创 2024-12-06 21:02:24 · 565 阅读 · 0 评论 -
C++ map和set的使用
• set的声明如下,T就是set底层关键字的类型• set默认要求T⽀持⼩于⽐较,如果不⽀持或者想按⾃⼰的需求⾛可以⾃⾏实现仿函数传给第⼆个模 版参数• set底层存储数据的内存是从空间配置器申请的,如果需要可以⾃⼰实现内存池,传给第三个参 数。• ⼀般情况下,我们都不需要传后两个模版参数。• set底层是⽤红⿊树实现,增删查效率是O(logN) ,迭代器遍历是⾛的搜索树的中序,所以是有序 的。原创 2024-12-05 21:22:23 · 781 阅读 · 0 评论 -
C++ 二叉搜索树
⼆叉搜索树⼜称⼆叉排序树,它或者是⼀棵空树,或者是具有以下性质的⼆叉树:• 若它的左⼦树不为空,则左⼦树上所有结点的值都⼩于等于根结点的值• 若它的右⼦树不为空,则右⼦树上所有结点的值都⼤于等于根结点的值• 它的左右⼦树也分别为⼆叉搜索树• ⼆叉搜索树中可以⽀持插⼊相等的值,也可以不⽀持插⼊相等的值,具体看使⽤场景定义,后续我 们学习map/set/multimap/multiset系列容器底层就是⼆叉搜索树,其中map/set不⽀持插⼊相等 值,multimap/multiset⽀持插⼊相等值。原创 2024-12-05 20:37:22 · 1032 阅读 · 0 评论 -
归并排序-加餐
我之前讲的一些常见的排序都是内排序,他们的排序思想适应的是数据在内存中,支持下标的随机访问。归并排序的思想不需要随机访问数据,只需要依次按序列读取数据,所以归并排序既是一个内排序,也是一个外排序。原创 2024-10-17 21:02:14 · 360 阅读 · 0 评论 -
快速排序-加餐
决定快排性能的关键点是每次单趟排序后,key对数组的分割,如果每次选的key基本都二分居中,那么快排的递归树就是一棵均匀的满二叉树,性能达到最佳。但是在实践中虽然不可能每次都是二分居中,但是性能也是可控的,但是如果每次选到最小或者最大值,就会划分成0和N-1个子问题,时间复杂度就会变成O(N^2),就比如数组是有序的就会出现这种情况。在之前相关的章节,我们用了三数取中随机选取key和小区间优化来解决这个问题,虽然解决了大多数问题,但是还是有一些场景没能解决,就比如数组中有大量重复的数据。原创 2024-10-16 19:48:48 · 626 阅读 · 0 评论 -
数据结构-排序2
1. 快速排序整体的综合性能和使用场景都是比较好的,所以才敢叫快速排序2. 时间复杂度:O(N*logN)3. 空间复杂度:O(logN)4. 稳定性:不稳定1. 归并的缺点在于需要O(N)的空间复杂度,思考更多的是解决在磁盘中的外排序问题。2. 时间复杂度:O(N*logN)3. 空间复杂度:O(N)4. 稳定性:稳定。原创 2024-10-15 09:36:09 · 1002 阅读 · 0 评论 -
数据结构-排序1
排序:所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。稳定性:假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次 序保持不变,即在原序列中,r[i]=r[j],且r[i]在r[j]之前,而在排序后的序列中,r[i]仍在r[j]之前,则称这种排 序算法是稳定的;否则称为不稳定的。内部排序:数据元素全部放在内存中的排序。外部排序:数据元素太多不能同时放在内存中,根据排序过程的要求不断地在内外存之间移动数据的排序。原创 2024-10-08 21:37:58 · 1067 阅读 · 0 评论 -
二叉树—相关结构
叶子结点:没有孩子的节点。原创 2024-10-07 11:47:21 · 427 阅读 · 0 评论 -
二叉树的遍历
先简单手搓一个二叉树,快速进入本次的操作学习。}BTNode;如图所示,一棵二叉树,上述代码并不是创建二叉树的方式,真正创建方式后序详解重点讲解。再看二叉树基本操作前,再回顾下二叉树的概念,二叉树是:1. 空树2. 非空:根结点,根结点的左子树、根结点的右子树组成的。原创 2024-10-07 11:24:31 · 893 阅读 · 0 评论 -
顺序表专题和应用
具有相同特性的数据结构的集合。物理结构:不一定连续逻辑结构:一定是连续的。原创 2024-09-15 15:51:25 · 345 阅读 · 0 评论 -
带环链表问题
/相遇while(meet!=head)原创 2024-05-09 20:51:13 · 702 阅读 · 0 评论 -
数据结构 1
算法(Algorithm)就是定义良好的计算过程,他取一个或一组的值为输入,并产生出一个或一组值作为 输出。简单来说算法就是一系列的计算步骤,用来将输入数据转化成输出结果。3.数据结构和算法的书籍资料学习完数据结构知识,可以去看《剑指offer》和《程序员代码面试指南》。4.算法的效率衡量一个算法的好坏,要从它的程序的时间复杂度和空间复杂度两方面来分析。时间复杂度主要衡量一个算法的运行快慢,而空间复杂度主要衡量一个算法运行所需要的额外空间。5.时间复杂度。原创 2024-09-14 12:37:02 · 707 阅读 · 0 评论 -
单链表专题
链表是一种物理存储结构上非连续,非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序来实现的,链表也是线性表的一种。原创 2024-09-15 21:49:39 · 454 阅读 · 0 评论 -
双链表专题
这里的双向链表我们称之为带头双向循环链表。内置结构:以整形为例,包括存储的数据,后继指针和前驱指针int data;int* next;int* prev;这里的带头是指具有哨兵位节点,哨兵位节点不存储任何有效元素,相当于“”放哨的”。双向链表的增删查改不能改变哨兵位,哨兵位存在的意义:避免循环链表出现次循环。原创 2024-09-17 14:16:23 · 256 阅读 · 0 评论 -
数据结构-栈
栈:栈是一种特殊的线性表,它只允许在固定的一端进行元素的插入和删除操作。进行数据操作的一端我们称之为栈顶,那另一端被称为栈底。栈的元素都遵循后进先出LIFO (Last In First Out)的原则。压栈:是指栈的插入数据的操作,也叫进栈和入栈。出栈:是指栈的删除数据的操作。压栈和出栈的数据操作都是在栈顶完成的。原创 2024-10-01 09:58:42 · 642 阅读 · 0 评论 -
数据结构-队列
队列:是一种特殊的线性表,只允许在一端进行数据的插入操作,在另一端进行数据的删除操作。队列的特性是队里的元素都遵循先进先出FIFO(First In First Out)的原则。入队列:进行数据插入的一端被称为队尾。出队列:进行数据删除的一端被称为队头。原创 2024-10-01 11:07:33 · 519 阅读 · 0 评论 -
栈和队列的相互实现(C)
栈后进先出,队列先进先出,这里我们要用两个队列实现栈。LeetCode 225.用队列实现栈 (C语言,要自己造轮子,造个栈的结构出来)例如,队列先进数据是1234,然后出数据遵循栈的后进先出就是4321.原创 2024-10-02 17:19:06 · 400 阅读 · 0 评论 -
二叉树--堆
普通的二叉树是不适合用数组来存储的,因为可能会存在大量的空间浪费。而完全二叉树更适合使用顺序结 构存储。现实中我们通常把堆(一种二叉树)使用顺序结构的数组来存储,需要注意的是这里的堆和操作系统 虚拟进程地址空间中的堆是两回事,一个是数据结构,一个是操作系统中管理内存的一块区域分段。原创 2024-10-04 20:32:32 · 1113 阅读 · 0 评论 -
树--二叉树
树是一种非线性的数据结构,它是由n(n>=0)个有限节点组成的一个具有层次关系的集合,它的外形像像一棵倒挂的树,根向上,叶子是向下的,所以我们称之为树。树有一个特殊节点,就是它的根节点,它的根节点是没有前驱节点的。除根结点外,其余结点被分成M(M>0)个互不相交的集合T1、T2、……、Tm,其中每一个集合Ti(1又是一棵结构与树类似的子树。每棵子树的根结点有且只有一个前驱,可以有0个或多个后继。所以,树是递归定义的。树的数据结构中,它的子树之间是不能有交集的,不然就破坏了树的结构,不是树了。原创 2024-10-03 11:25:27 · 690 阅读 · 0 评论