数据结构
文章平均质量分 88
深入理解数据结构
UrSpecial
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
哈希表深度解析
摘要:哈希表通过哈希函数将键(Key)映射到数组索引实现高效查找,时间复杂度接近O(1)。文章解析了哈希表的核心原理:哈希函数计算"门牌号"、两种冲突解决方法(开放定址法和链地址法),以及动态扩容机制。重点探讨了线性探测和二次探测的优劣,分析链地址法中头插法的优势,并解释了负载因子对性能的影响。理解这些底层机制有助于优化哈希表使用,解决查找性能问题。原创 2025-09-17 13:02:17 · 800 阅读 · 0 评论 -
【数据结构取经之路】快速排序的非递归实现
递归实现快速排序在一些场景下有栈溢出的风险,下面就谈谈如何用非递归的方法实现快速排序。原创 2024-03-13 23:03:42 · 422 阅读 · 0 评论 -
【数据结构取经之路】单链表
单链表是一种链式存取的数据结构,用一组地址任意的存储单元存放线性表中的数据元素。,数据域就是存储数据的存储单元,指针域就是连接每个结点的地址数据。接着再来说说单链表的意义,也就是它的优势。单链表的优势是相对于和它同属于线性表的顺序表而言的。顺序表的特点是逻辑关系上相邻的两个元素在物理位置上(内存中的真实存储情况)也相邻 ,因此,可以通过下标的随机访问来取出任意元素。但也正因为顺序表物理空间上的连续,在作插入或删除操作时,需要移动大量元素。原创 2024-01-05 15:12:46 · 1883 阅读 · 1 评论 -
【STL】list的模拟实现
1)list是可以在常数范围内在任意位置进行插入和删除的序列式容器,并且该容器可以前后双向迭代。2)list的底层是双向链表结构。3)list和forward_list非常相似,最主要的不同在于forward_list是单链表,只能朝前迭代,以让其更简单高效。4)与其他的序列容器相比(array, vector, deque),list通常在任意位置进行插入、删除元素的执行效率更高。5)与其他序列容器相比,list和forward_list的最大缺陷是不支持随机访问。原创 2024-07-01 21:13:34 · 853 阅读 · 0 评论 -
【数据结构取经之路】栈
用数组实现的栈叫顺序栈,用链表实现的栈叫链式栈,本文讲解的是顺序栈。初始化操作一般有两种,第一种,在初始化时就给数组分配一定的空间,第二种,初始化时不给分配空间,第一次插入数据时才个数组分配空间。虽然简单,但请不要写成pst->a[pst->top--]. 后置--是有副作用的,也就是说会改变top的值,但这里不需要改变top的值。顺序栈的删除实际上就是数组最后一个元素的删除,不需要挪动数据,top--即可,这样即使数组中还存在该元素,但是已经访问不到了。top的值就是栈的大小,所以返回top即可。原创 2024-03-19 23:06:18 · 745 阅读 · 0 评论 -
【数据结构取经之路】快速排序及其优化
快速排序由C. A. R. Hoare在1962年提出,快速排序是一种高效的排序算法,其核心思想是通过一次排序将待排序的数据分割成独立的两部分,其中一部分的所有数据都比另一部分的数据要小,然后再按此方法对这两部分数据分别进行快速排序,以实现整个序列有序。下文将给出实现快排的三种方法:霍尔法、挖坑法、前后指针法。同时也会给出面对一些特殊场景做出的优化。原创 2024-03-13 16:14:46 · 995 阅读 · 0 评论 -
【数据结构取经之路】归并排序
归并排序是建立在归并操作上的一种有效,稳定的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。原创 2024-03-11 11:00:30 · 1114 阅读 · 0 评论 -
【数据结构取经之路】建堆&堆排序
堆排序(Heapsort)是指利用堆积树(堆)这种数据结构所设计的一种排序算法,它是选择排序的一种。可以利用数组的特点快速定位指定索引的元素。原创 2024-03-15 13:51:06 · 1013 阅读 · 0 评论 -
【C++】string类常用函数用法总结
const char& operator[] (size_t pos) const,const_iterator begin() const,const_iterator end() const,const修饰*this,即this指针指向的内容,所以this指针指向的内容不可修改,用法上和其他函数是一样的。resize(size_t n)和resize(size_t n, char c)都是将字符串的有效个数改变到n个,不同的是,当使用 std::string::resize(size_t n)原创 2024-05-13 12:39:13 · 960 阅读 · 0 评论 -
【数据结构取经之路】希尔排序
而多组并排呢,是先对9和6进行插入排序得到6 9,接着对下一组(蓝色数组)的8和5进行插入排序,并不是一次性将蓝色数组排好序得到2 5 8,而是不同组之间交替的进行部分插入排序。相较于直接插入排序,当gap不等于1时,元素不是一步一步的挪动的,而是跳跃式的移动,从而使得在进行最后一趟增量gap = 1的插入排序时,数组已基本有序,只要少量移动和比较即可完成排序。希尔排序的分析是一个复杂的问题,因为它的时间是所取“增量”序列的函数,这涉及到一些数学上尚未解决的难题。间隔为gap的分为一组,总计gap组。原创 2024-03-16 00:32:37 · 810 阅读 · 0 评论 -
【数据结构取经之路】队列&循环队列
循环队列的实现一般定义两个指针,头指针front和尾指针rear,front和rear开始都赋为0,每插入一个元素,rear++,每删除一个元素,front++,这和顺序栈如出一辙。因为是用单链表实现队列,如果仅仅记录队头,那么在插入数据时必须得遍历一遍链表,找到队列的尾,才能链接上新的结点,这是一个不小的消耗,所以,除了对链表的结点封装成一个结构体(A)外,还可以再封装一个结构体(B),B结构体成员里包含结构体A。在销毁节点A前,需要先记录A的下一个结点,否则把A释放后,将找不到它的下一个节点。原创 2024-03-21 23:55:49 · 833 阅读 · 0 评论 -
【数据结构取经之路】图解AVL树
前两点我相信大家都没有疑问,可能有疑问的点在于:为什么需要指向父节点的指针?请看上图,假设值为-1的结点是新插入的结点,那么在插入之前值为1的结点的平衡因子为0。插入值为-1的结点之后,值为1的结点的平衡因子需要更新为-1。新插入的值为0的结点的左右指针均指向空,那么我们如何能找到新插入节点的父节点,然新它的平衡因子呢?这时引入指向父节点的指针就可以帮助我们简单快速的解决这个问题。通过该指针,我们很容易找到每一个节点的父节点,方便插入节点时修改父节点的平衡因子。原创 2024-09-17 16:29:25 · 1202 阅读 · 0 评论 -
【C++取经之路】set的详细介绍及其使用
再谈容器,先问一个问题:何为容器?《STL源码剖析》一书中是这么解释的——容器,置物之所也。根据“数据在容器中的排列”特性,容器可以分为序列式容器和关联式容器两种。序列式容器,其底层为线性序列的数据结构,里面存储的是数据本身。关联式容器,其底层是红黑树(一种平衡搜索树),里面存储的是结构的键值对,也是存储数据本身的。set和map均为关联式容器。原创 2024-09-05 14:59:04 · 1037 阅读 · 0 评论 -
【数据结构取经之路】布隆过滤器BloomFilter原理、误判率推导、代码实现
在一些场景下面,有大量数据需要判断是否存在,而这些数据不是整形,导致位图就派不上用场。这时,时代无比呼唤一种新的解决方案,布隆过滤器也就应运而生了。布隆过滤器(Bloom Filter)是1970年由布隆提出的。它实际上是一个很长的二进制向量和一系列随机映射函数(哈希函数)。布隆过滤器可以用于检索一个元素是否在一个集合中。它的优点是空间效率和查询时间都比一般的算法要好得多,缺点是有一定的误判率和删除困难。原创 2024-09-02 22:03:20 · 1615 阅读 · 0 评论 -
【数据结构取经之路】图解红黑树
AVL-tree之外,另一个颇具历史且被广泛使用的平衡二叉搜索树是红黑树(RB-tree),这名字听起来除了很抽象外,还颇具大哥味哈,会不会很难?客观地说,难度是有的,下面我们细细道来。//结点的颜色//红黑树结点的定义//结点的左孩子//结点的右孩子//结点的父节点//结点的颜色T _data;//结点的数据域{}以上就是红黑树节点定义,但有两个问题:为什么需要指向父节点的指针?为什么要将结点的默认颜色设置成黑色?先来回答第一个问题,在旋转时需要访问父节点,所以引入了指向父节点的指针。原创 2024-09-20 22:52:06 · 1182 阅读 · 0 评论 -
push_back()和emplace_back()的区别
emplace_back()向容器末尾添加元素时,直接在容器内部构造这个元素,而不是先构造一个对象再拷贝或移动到容器中。在底层实现时,emplace_back()的参数会被转发到容器内部新元素的构造函数中。这意味着元素的构造直接在容器的内存位置上进行,避免了不必要的复制或移动操作。push_back()向容器末尾添加元素时,首先会创建这个元素,然后再将这个元素拷贝或者移动到容器中。push_back() -> 构造 + 拷贝构造 / 构造 + 移动。emplace_back() -> 构造。原创 2024-09-01 15:22:25 · 314 阅读 · 0 评论 -
【C++取经之路】map的详细介绍及其使用
理论元素这个名词是出自文档的,我只是知识的搬运工。其实这个底层的红黑树的设计有关。大概是这样子的:它有一个哨兵位结点(上方的),两边的就是理论元素了。原创 2024-09-05 21:32:51 · 1146 阅读 · 0 评论 -
【数据结构取经之路】二叉搜索树的实现
首先,二叉搜索树是一种数据结构,了解二叉搜素树有助于理解map和set的特性。K _key;原创 2024-07-13 13:37:49 · 1136 阅读 · 0 评论 -
【数据结构取经之路】位图全解
位图(Bitmap)是一种非常高效的数据结构,主要用于处理大量数据的快速查找、去重等操作。它利用每一位(bit)来表示某个元素是否存在或某种状态,从而极大地节省了存储空间。在内存和存储空间相对受限的环境下,位图尤其有用。下面,我们先瞅一眼C++标准库里的位图,然后再抽出它的核心部分来自己实现。原创 2024-09-01 12:10:25 · 1517 阅读 · 0 评论 -
【C++取经之路】红黑树封装set
本文参考《STL源码剖析》中SGI STL对红黑树的结构设计,涉及到红黑树迭代器的实现等,所以在读这篇文章之前,我希望你对红黑树有一定的了解,比如在红黑树插入时的变色和旋转操作,最好自己实现过。不然这篇文章对你可能不太友好,因为本文对红黑树的结构设计较为复杂,插入时的操作细节不会在本文详细说明。说实话,封装set对其实很简单,难点在于前期的红黑树设计上,在设计上的一些细节还是很有挑战的。下面我们进入正题,一起领略写SGI STL的大佬们的风采。//旋转时需要访问父节点//颜色//数据域{}原创 2024-09-24 23:38:23 · 867 阅读 · 0 评论 -
【STL】vector的模拟实现
1)vector是可变数组大小的序列容器2)与数组相比,vector提供了更多的功能3)vector会分配一些额外的空间以适应可能得增长。原创 2024-07-07 23:57:01 · 997 阅读 · 0 评论
分享