数据结构与算法
文章平均质量分 95
Vect__
我真的什么也不会
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
使用golang重温堆结构
堆是一种用数组存储的完全二叉树结构,父节点与子节点保持固定大小关系(大根堆父节点≥子节点,小根堆父节点≤子节点)。堆在动态获取最大/最小值场景中高效,插入和删除操作时间复杂度为O(log n)。堆的核心操作包括:查看堆顶(O(1))、元素入堆(向上调整)、堆顶出堆(交换后向下调整)和批量建堆(从非叶子节点开始向下调整)。堆通过父子节点下标公式实现快速访问,无需指针存储,具有内存连续性和高效性。文章详细介绍了堆的实现原理和Go语言代码示例,包括Push、Pop、建堆等关键操作。原创 2026-07-10 21:18:07 · 272 阅读 · 0 评论 -
快排的两种写法和一些思考
本文介绍了两种快速排序的实现方法:对撞双指针法和三指针划分法。两种方法的核心思想都是通过选取基准值(key)来划分区间,递归处理子区间。对撞双指针法使用i和j指针从两端向中间扫描交换元素;三指针划分法则通过i、l、r三个指针将数组分为小于、等于和大于key的三部分。文章分析了时间复杂度,良好情况下为O(nlogn),最坏情况下退化为O(n²)。最后提出通过随机选取基准值来优化性能,并强调快排的本质是通过分治策略将复杂问题分解为子问题来解决。原创 2026-04-21 16:01:39 · 341 阅读 · 0 评论 -
别再让搜索树变竹竿!AVL 旋转四连招详解!
摘要:AVL树是一种自平衡二叉搜索树,通过平衡因子(右子树高度-左子树高度)确保每个节点平衡因子的绝对值≤1。当插入或删除导致树失衡(平衡因子为±2)时,通过旋转操作(右旋、左旋等)恢复平衡。文章详细分析了AVL树的结构定义、插入逻辑以及旋转操作(以右旋为例),展示了如何通过调整子树高度保持高效操作性能,解决普通二叉搜索树退化为链表的问题,实现O(logn)的时间复杂度。原创 2025-10-30 20:00:53 · 1009 阅读 · 48 评论 -
初学二叉搜索树踩坑多?C++ 从原理到代码,搞定增删查全流程
本文介绍了二叉搜索树的基本概念和操作实现。二叉搜索树满足左子树节点值小于根节点值,右子树节点值大于根节点值的特性。文章详细讲解了查找、插入和删除三种核心操作:查找采用二分思想,时间复杂度为O(logn);插入需找到合适位置并保持树结构;删除则根据节点子节点数量分为三种情况处理,重点阐释了删除有两个子节点时的替换策略。通过C++代码示例展示了二叉搜索树类的具体实现方法,包括节点结构定义和各类操作的算法流程。原创 2025-10-27 13:11:16 · 1963 阅读 · 51 评论 -
万字长文带你从0到实战,全面吃透八大排序算法
从底层到实战,图文并茂详解八大排序算法原创 2025-10-10 19:02:45 · 838 阅读 · 27 评论 -
二叉树实战笔记:结构、遍历、接口与 OJ 实战
本文聚焦 “二叉树实战”,系统覆盖从基础到应用全流程。先铺垫树的基础概念(节点度、层次等)及特殊二叉树(满、完全二叉树)特性;再用 C++ 模板实现二叉树节点结构体与类,手搓1-2-3/4-5-6示例树,展示内存组织逻辑。核心解析遍历技术:前中后序递归遍历(根左右 / 左根右 / 左右根)的 “递 - 归” 思想,及层序遍历的队列应用;实战含 LeetCode 题解(单值、相同树、对称树、子树)与常用接口(最大深度、节点总数、k 层节点数、值查找)。原创 2025-10-05 21:01:27 · 1342 阅读 · 45 评论 -
从堆到TopK:一文吃透核心原理与实战应用
本文系统介绍了树和堆的数据结构及其核心原理。主要内容包括:1)树的基本概念与术语,如节点度、层次、深度等;2)二叉树的定义与特殊类型(满二叉树、完全二叉树);3)堆的本质是完全二叉树,分为大顶堆和小顶堆;4)堆的底层实现依赖动态数组和两个核心操作:向上调整(用于插入元素)和向下调整(用于删除堆顶),通过索引关系高效维护堆结构;5)介绍了两种建堆方法的时间复杂度差异。文章通过图示和代码示例详细说明了堆的调整过程,为理解优先队列等高级数据结构奠定了基础。原创 2025-10-04 20:03:43 · 1312 阅读 · 28 评论 -
从直线到环形:解锁栈、队列背后的空间与效率平衡术
本文介绍了两种经典数据结构——栈和队列的底层实现与特性。栈采用后进先出(LIFO)原则,可通过动态数组或链表实现,支持压栈、出栈等高效操作,常用于函数调用、撤销操作等场景。队列遵循先进先出(FIFO)原则,但数组实现会面临"假溢出"问题。为此,文中提出循环队列的解决方案,通过首尾相连提高空间利用率。文章通过C++代码展示了栈和队列的具体实现,并探讨了它们在实际应用中的价值,体现了数据结构从简单到优化的演进过程。原创 2025-10-02 18:28:58 · 992 阅读 · 27 评论 -
链表相关OJ题
思路:创建一个哨兵位指向head,创建一个cur临时指针,遍历链表,遇到等于val的节点跳过即可,最后返回即链表的头节点创建一个哨兵位就避免了讨论head是否为空。原创 2025-09-01 20:35:54 · 1308 阅读 · 18 评论 -
链表漫游指南:C++ 指针操作的艺术与实践
上一章的顺序表底层是数组,封装了增删查改的功能接口成为了顺序表。存储顺序表的空间是连续的,顺序表非常大时,内存可能无法提供这么大的连续空间,由此,链表就被创造了。在一个复杂的系统中,空闲的内存空间散落在内存各处,而链表通过指针很好的链接起了各个分散的内存空间。如图:内存空间分配并不连续,但是指针称为维系各个空间的桥梁。原创 2025-08-23 13:35:07 · 1540 阅读 · 20 评论 -
从零实现自定义顺序表:万字详解 + 完整源码 + 图文分析
刚入门C++数据结构的你,是不是也遇到过这些头疼的问题?想实现一个能灵活存数据的顺序表,却卡在类结构设计上,不知道该用哪些成员变量;好不容易写了插入、删除接口,却总出现数组越界、数据覆盖的 bug;甚至还没搞懂动态扩容的原理,程序就因为内存泄漏崩溃了……原创 2025-08-20 12:39:07 · 1139 阅读 · 15 评论 -
复杂度分析
时间复杂度分析统计的不是算法运行的时间,运行时间和平台环境也有着很大的关系,这个不是我们能控制的,所以,我们。还有个有趣的知识,假设中国十四亿人口,每个人的省份证号按序排列,找一个人最多需要找多少次?常数阶 < 对数阶 < 线性阶 < 线性对数阶 < 平方阶 < 指数阶 < 阶乘阶。和指数阶相反,对数阶反映“每轮缩减到一半”。平方阶通常出现在嵌套循环中,内外层循环都为。,函数运行时所要的栈帧空间在编译期间已经确定好了,因此。,我们举个例子看一下,假设输入数据大小为。,每轮缩减到原来的一般,循环次数是。原创 2025-08-19 11:31:20 · 886 阅读 · 7 评论
分享