数据结构
文章平均质量分 74
Tairitsu_青云
C/C++开发路上的一名攀登者,通过博客固化所学。期待与同行者交流,共同进步~
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
[C++高阶数据结构·图论下] 最短路径:为什么“挑最小的”一定正确?
本文系统对比最小生成树与最短路径的核心差异,聚焦三类最短路算法:Dijkstra(非负权、贪心确认)、Bellman-Ford(可负权、反复松弛)、Floyd(全源、分层中转)。核心区别在于:MST 关注“连通所有点”的最小代价(边数固定),而最短路关注“两点间路径最短”(边数可变)。关键反直觉点是:负权对 MST 无害,却使 Dijkstra 失效——因“绕远更近”破坏贪心前提。算法本质反映三种处理不确定性的策略:确认式(Dijkstra)、迭代修正(Bellman-Ford)、分层逼近(Floyd)。强原创 2026-11-02 22:03:00 · 521 阅读 · 0 评论 -
[C++高阶数据结构·图论上] 最小生成树:为什么“选边”和“选点”是两条路?
本文系统讲解最小生成树(MST)的核心思想与两大算法:Kruskal与Prim。强调MST目标是用最小权值总和连接所有顶点形成一棵树,而非单边最小。通过三条构造准则(用图中边、恰n-1条边、无环)统一框架。Kruskal按边贪心,依赖并查集判环,适合稀疏图;Prim按点扩张,利用割集特性天然避免成环,需起点,适合稠密图。两算法本质差异在于“判环”机制与数据结构选择,且与最短路径问题在连通性、负权处理上截然相反,需分篇厘清。原创 2026-11-02 20:08:17 · 222 阅读 · 0 评论 -
[C++高阶数据结构] LRU Cache 的两张表,为什么必须互相存对方的位置?
LRU缓存通过哈希表与双向链表结合实现O(1)时间复杂度。哈希表存储键到链表迭代器的映射,快速定位;链表按访问顺序维护节点,头部为最近使用,尾部为最久未用。get操作命中则将节点移至头部,未命中返回-1;put操作更新或插入节点,容量满时淘汰尾部节点。关键技巧包括:链表节点存key以支持反查删除、使用splice移动节点避免迭代器失效、双容器协同保证高效性。原创 2026-10-31 10:11:55 · 368 阅读 · 2 评论 -
[C++高阶数据结构] 图的定义 | 邻接矩阵 | 邻接表 | 图的遍历方式
图是由顶点集与边集构成的数据结构,记作 $ G = (V, E) $。与树不同,图可有环、不连通,且两点间路径不唯一。分为无向图与有向图,区别在于边的方向性,影响度、连通性及矩阵对称性。完全图边数分别为 $ \frac{n(n-1)}{2} $(无向)和 $ n(n-1) $(有向)。存储结构上,邻接矩阵适合稠密图,支持快速判断连通性,但空间复杂度高;邻接表更适合稀疏图,便于遍历邻接点,节省空间。原创 2026-10-20 20:07:08 · 479 阅读 · 1 评论 -
[C++高阶数据结构] 并查集原理 | 模拟实现 | 力扣算法题实战
并查集用于维护不相交集合,支持查找根节点、合并集合及统计集合数量。通过数组实现,负数表示根节点(绝对值为集合大小),非负数表示父节点。优化包括路径压缩和小树合并大树,提升效率。典型应用如“省份数量”和“等式可满足性”,通过遍历关系建立并查集,最终统计连通分量数或验证约束一致性。原创 2026-10-19 18:00:26 · 268 阅读 · 2 评论 -
[C++] 泛型哈希表设计:从零封装unordered_set与unordered_map
本文介绍C++11的unordered_set与unordered_map,底层为哈希桶,增删查改平均O(1)。与set/map相比,要求key可转整型并支持相等比较,迭代器单向,遍历无序。二者复用同一HashTable封装,通过仿函数提取key,map额外支持operator[]。原创 2026-09-08 21:06:00 · 8824 阅读 · 0 评论 -
[C++] 哈希表:从原理剖析到模拟实现
哈希是一种通过哈希函数将关键字映射到存储位置、支持O(1)查找的思想。哈希冲突不可避免,可用负载因子衡量冲突概率。减少冲突可优化哈希函数与扩容。处理冲突常用开放定址法和链地址法,后者即哈希桶,是STL采用的主流方案。原创 2026-09-06 20:54:51 · 14222 阅读 · 0 评论 -
[C++] 深入理解红黑树:封装set与map
本文基于GCC源码分析set和map共用红黑树模板,通过仿函数提取key,适配不同容器;模拟实现迭代器、插入查找及map的operator[],重点阐述中序遍历下迭代器增减的节点跳转逻辑,实现代码复用。原创 2026-09-05 12:07:40 · 15100 阅读 · 0 评论 -
[C++] 深入理解红黑树与代码实现
红黑树详解与实现:红黑树是一种自平衡二叉搜索树,通过节点着色规则维护平衡性。文章首先介绍了红黑树的四大性质:根节点为黑、无连续红节点、各路径黑节点数相同。时间复杂度分析表明其操作效率为O(logN)。重点讲解了插入操作的实现细节:空树直接插入黑根节点;非空树插入红节点后,根据uncle节点颜色进行不同处理(变色或旋转+变色)。文章详细分析了四种旋转情况(左/右单旋、左右/右左双旋)的变色规则,并提供了C++代码框架和关键实现逻辑。红黑树相比AVL树旋转次数更少,被广泛应用于STL等标准库中。原创 2026-06-12 22:24:58 · 14700 阅读 · 9 评论 -
C++:深入理解AVL树与代码实现
AVL树是一种自平衡二叉搜索树,其核心特性是左右子树高度差的绝对值不超过1,通过平衡因子(右子树高度减左子树高度)来控制平衡。文章详细介绍了AVL树的结构设计(包含平衡因子和父节点指针)、插入操作(包括平衡因子更新和四种旋转调整:右单旋、左单旋、左右双旋、右左双旋)、查找操作以及平衡性检测方法。AVL树的平衡特性使其时间复杂度稳定在O(logN),优于普通二叉搜索树。文中还提供了C++代码实现和平衡验证方法,帮助读者深入理解AVL树的工作原理和实现细节。原创 2026-06-04 20:15:04 · 386 阅读 · 24 评论 -
C++:深入理解二叉搜索树与代码实现
本文介绍了二叉搜索树的基本概念和常见操作。二叉搜索树具有左子树节点小于根节点、右子树节点大于根节点的特性,支持插入、查找和删除操作,时间复杂度在最优情况下为O(logN),最差情况下为O(N)。文章详细讲解了插入、查找和删除节点的具体实现步骤,并提供了C++代码示例。此外,还分析了key-only和key-value两种存储方式的应用场景,前者适用于简单查找,后者适用于统计和映射关系。最后指出二叉搜索树的局限性,引出AVL树、红黑树等优化结构。全文内容简明扼要,适合快速了解二叉搜索树的核心知识点。原创 2026-06-01 20:01:23 · 313 阅读 · 14 评论 -
C++:优先队列的模拟实现
本文介绍了优先队列的堆实现方式及其C++模拟实现:优先队列作为容器适配器,默认使用vector作为底层容器,通过堆算法维护元素优先级。原创 2026-05-13 19:43:37 · 441 阅读 · 11 评论 -
C语言:排序(二)
本文系统介绍了三种经典排序算法:快速排序、归并排序和计数排序。最后通过对比表格总结了七大排序算法的性能特征,为算法选择提供了参考依据。原创 2026-04-13 21:40:07 · 521 阅读 · 3 评论 -
C语言:排序(一)
本文介绍了五种基础排序算法及其C语言实现。原创 2026-04-10 20:48:30 · 300 阅读 · 0 评论 -
二叉树(C语言)
本文介绍了二叉树的基本概念及其C语言实现。原创 2026-04-07 20:41:22 · 79 阅读 · 0 评论 -
堆(C语言)
本文介绍了堆的定义与实现,还探讨了堆的两个重要应用:堆排序(时间复杂度O(NlogN))和TopK问题,通过代码示例展示了如何高效地找出前K个最大/最小元素。原创 2026-04-06 14:55:38 · 249 阅读 · 0 评论 -
队列(C语言)
本文介绍了队列的定义和C语言实现。原创 2026-04-03 15:30:49 · 59 阅读 · 0 评论 -
栈(C语言)
本文介绍了栈的数据结构及其实现方式。原创 2026-04-02 20:04:22 · 63 阅读 · 0 评论 -
双链表(C语言)
文章详细讲解了双链表的定义和C语言实现,包括节点创建、初始化、插入删除等基本操作。相比单链表,双链表通过prev指针简化了前驱节点的查找过程,提高了操作效率。表结构的使用提供了参考。原创 2026-03-31 20:03:09 · 645 阅读 · 0 评论 -
单链表(C语言)
文章详细讲解了单向不带头不循环链表的实现,包括节点结构定义(包含数据和指向下一节点的指针)以及常用操作的代码实现,如初始化、增删查改、打印和销毁等功能。原创 2026-03-31 19:46:35 · 54 阅读 · 0 评论 -
动态顺序表(C语言)
本文介绍了顺序表的基本概念和实现方法,包括初始化(SLInit)、销毁(SLDestroy)、检查容量(SLCheckCapacity)等基本功能,以及头插(SLPushFront)、尾插(SLPushBack)、头删(SLPopFront)、尾删(SLPopBack)等常用操作。原创 2026-03-29 16:34:25 · 58 阅读 · 1 评论
分享