![](https://img-blog.csdnimg.cn/20201014180756754.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构
文章平均质量分 94
Dio夹心小面包
"放弃学习的我们是没有翅膀的雄鹰 不会理智的我们是根茎腐烂的大树"
展开
-
『 C++ - STL 』位图(BitMap)与布隆过滤器(Bloom Filter)
腾讯曾经有一道面试题是这样的:存在40亿个不重复的无符号整数,其中这些数据并未排过序;给定一个无符号整数,如何快速判断这个数是否存在于这40亿个数中;很显然,这个面试题问的是一个数据在不在的问题;那么如何能够对数据进行判断在不在的问题?遍历数据逐个判断遍历数据逐个判断可以理解为一种暴力的解法,这种暴力的解法通过枚举的思路对数据逐个查询;但实际上该方法的时间复杂度为O(N)[由于需要遍历整组数据]......;原创 2024-02-15 20:10:24 · 1217 阅读 · 1 评论 -
『 C++ - STL 』unordered_xxx系列关联式容器及其封装(万字)
unordered系列关联式容器在C++11标准中被首次引入,与有序容器不同,unordered系列的关联式容器并不会去维护数据中各个元素的顺序,由于该系列容器为哈希表实现,所以整体的存储顺序是由哈希函数决定的,可以在一些不需要对数据进行排序的场景下提供更快的性能;原创 2024-02-06 17:45:04 · 1547 阅读 · 3 评论 -
『 C++ - Hash 』闭散列与开散列哈希表详解及其实现 ( 万字 )
哈希表是一种常用的数据结构,该数据结构往往能存储大量的数据,在C++当中,底层为哈希表的容器最常见的为unordered_xxx系列,例如unordered_map与unordered_set,这两个容器是在C++当中以哈希表为底层的关联式容器,具体的关联式容器的特点参照上篇;哈希表通过一个叫做哈希函数(Hash Function)的算法,将存储的每个数据项与一个唯一的键值(key)进行绑定;这个函数会将每个键值映射到哈希表中的一个位置,以便对数据进行快速访问;原创 2024-02-04 23:50:53 · 1142 阅读 · 3 评论 -
『 C++ - STL』map与set的封装 ( 万字 )
map与set分别是STL中的两种序列式容器;它们是一种树形数据结构的容器,且其的底层构造为一棵红黑树;而在上一篇文章中提到,其实红黑树本身就是一棵二叉搜索树,是基于二叉搜索树的性质对其增加了平衡的属性来提高其综合性能(包括增删查改);当然也提到了红黑树与AVL树的区别:AVL树AVL树是一棵高度平衡搜索二叉树,其特点即为在搜索二叉树的基础上根据控制结构达到了最终的属性;即为,每一个节点的左右子树的高度差不超过1;红黑树红黑树是一棵近似平衡的二叉树,其特点为根据树的颜色(红色或是黑色)原创 2024-01-20 18:37:00 · 1033 阅读 · 0 评论 -
『 C++ 』红黑树RBTree详解 ( 万字 )
AVL树AVL树采用的是利用平衡因子来控制;红黑树红黑树采用的是以颜色来判断树的结构;由上文概念中几个规则可能引出一个问题:红黑树中的新节点应该是什么颜色?黑色?红色?如果一个节点为红色,其两个孩子节点必定为黑色;对于每一个节点,从该节点到所有后代叶节点的简单路径上,都包含相同数目的黑色节点;根据这两个规则进行引入,权衡利弊可以发现新节点无论是黑色还是红色都有可能违反两条规则中的其中一条规则;但是对于两条规则的违反代价来说,新节点为黑色的代价要高于新节点为红色的代价;原创 2024-01-17 17:32:44 · 1366 阅读 · 1 评论 -
『 C++ 』AVL树详解 ( 万字 )
从上文可知,AVL树可以看作是一棵搜索二叉树,其为基于搜索二叉树在此基础上对树做了平衡的操作使其在结构上变得平衡不至于在极端情况下出现"歪脖子树"的情况;AVL树的定义与平衡搜索二叉树的结构上呈现类似;//将节点进行typedefpublic:protected:private://节点指针该篇文章中重点实现AVL树中的插入操作;原创 2024-01-15 23:00:27 · 799 阅读 · 1 评论 -
『 C++ 』BinarySearchTree搜索二叉树
二叉树顾名思义即为一个树中节点的度不大于2的有序树,是树中结构中较为简单的一种;其特点为一个节点中分为两个子树;通常可以以二叉树进行分治的思路对问题进行解决(递归或非递归);但在实际中普通二叉树由于在数据存储方面中并没有明显的特性,所以在实际中普通二叉树的应用场景并不多;BinarySearchTree二叉搜索树,顾名思义这种类型的二叉树对搜索有着比较大的优势;原创 2023-12-08 01:01:28 · 399 阅读 · 11 评论 -
『C++ - STL』之优先级队列( priority_queue )
什么是优先级队列,从该名中可以知道他一定有队列的一定属性,即先入先出(LILO),而这里的优先级则可以判断出它的另一个特点就是可以按照一定的条件将符合该条件的先进行出队,这就是优先级队列;而在数据结构中有一个支持该操作的结构 - 堆( heap );而在STL中,这个优先级队列( priority_queue )也正是堆;原创 2023-10-17 11:54:26 · 499 阅读 · 4 评论 -
『C++之STL』双端队列 - deque
双端队列,Double-ended queue,简称为deque是一种线性结构的一种容器;在数据结构中出现的顺序表与链表,或者栈与队列都算是线性结构;在结构中,它与vector相比较会相似一些;但是在实际当中,双端队列 - deque 包含了vector与list的优点;vector(顺序表)支持随机访问,空间连续;尾插尾删效率高,但是头部插入删除以及中间插入删除的开销过大,扩容代价高;list(链表)任何位置的插入删除效率高,无扩容代价,但是内存碎片较多,且不支持随机访问;原创 2023-10-15 16:22:40 · 314 阅读 · 1 评论 -
【数据结构】排序合集(万字详解)
排序,以字面意思来说就是通过特定的算法将一组或多组无序或者接近有序的数据,以升序或者降序的方式重新进行排序组合;以升序的方式进行排序最终为:排序算法就是如何使得数据按照要求排列的方法;冒泡排序选择排序插入排序希尔排序归并排序快速排序堆排序计数排序排序算是一种较为基本的且需要掌握的算法,优秀的排序算法能在程序中使得效率倍式的提升;不同的排序算法可以根据不同的使用场景分别进行使用;排序中较为难的点为一些排序算法中的边界问题,以及递归中分治思路的理解;原创 2023-09-25 01:51:47 · 451 阅读 · 29 评论 -
【C++】STL之String模拟实现
该重载在实现过程中应该首先注意string 的扩容,若是盲目扩容2倍的话可能会出现,该字符串长度仍比2倍的_capacity要大,还有一种可能为,该字符串的长度只有1,若是已有的_capacity容量已经很大的话仍扩2倍则可能出现内存利用率不高等情况;共用同一块空间的危害若是处理好其实问题不大,但是唯一的问题在于析构部分,在一个对象的生命周期结束时将会去调用它的析构函数,而两个对象的_str指针都指向同一块空间,则会造成对一块空间的重复释放;原创 2023-09-14 21:03:35 · 177 阅读 · 25 评论 -
【数据结构】二叉树的前中后序遍历(C语言)
二叉树] 顾名思义就是有两个分支节点的树,不仅如此,除了叶子外的所有节点都具有两个分支节点;由于结构像一棵倒立的树,顾名思义为二叉树;如下图所示,该图即为一棵野生的二叉树;既然二叉树为树,固然有着和树一样的部分(叶子、根、分支…这些也成为了树相关的概念;二叉树除了前中后序遍历以外还有一种遍历方式叫作层序遍历,可以使用队列的FIFO特性从而完成该遍历的实现;在利用递归实现解决二叉树相关问题的过程中,可以根据实际情况选择相应的遍历方式从而以效率较高的方式解决问题;原创 2023-07-13 17:07:31 · 2621 阅读 · 3 评论 -
【数据结构】单链表
在线性表结构中,可以分为顺序存储结构与链式存储结构,顺序存储结构就好比数组,在一块连续的空间中存放对应的数据。而链式存储结构与顺序存储结构相比较下就不存在连续存储的空间,而是不同的空间通过指针联系在一起。由上图可知,链表在逻辑上是连续的,但是在物理上并不是连续的,每块空间都是在堆上被申请出来的,malloc函数每次申请的空间可能是连续的也可能不是连续的。操作链表的几个函数内都要注意对所给参数进行断言,防止对非法指针的解引用访问;原创 2023-05-11 13:38:47 · 354 阅读 · 8 评论