数据结构与算法
文章平均质量分 75
我为双鱼狂
这个作者很懒,什么都没留下…
展开
-
数据结构与算法-进阶(二十二)跳表
跳表可以降低有序链表的添加、删除和搜索的平均时间复杂度。跳表的应用场景也是比较多,比如在 Redis 中使用。它的实现逻辑也是值得去学习的。原创 2022-06-26 16:46:10 · 401 阅读 · 1 评论 -
数据结构与算法-进阶(二十一)动态规划案例
上期介绍动态规划的什么,有什么特性,能解决什么类型的问题。这期就通过一个案例,看一下动态规划解决问题的过程。原创 2022-06-19 21:56:57 · 136 阅读 · 0 评论 -
数据结构与算法-进阶(二十)动态规划
动态规划是求解最优化的一种常用策略,它依然需要拆分成若干个子问题,但是每个子问题只有求解一次,并保存它的解。可以用动态规划解决的问题需要有*最优子结构*和*无后效性*两个特定。原创 2022-06-17 23:46:59 · 162 阅读 · 0 评论 -
数据结构与算法-进阶(十九)分治
分治就是将原问题不断拆分成规模小的问题,直到小问题可以得出答案为止,然后再往上推导出原问题的答案。拆分的问题必须要和原问题结构是一致,这和递归的解答思路较大程度上是一致的。...原创 2022-06-04 10:22:24 · 293 阅读 · 0 评论 -
数据结构与算法-进阶(十八)贪心策略
贪心策略的本质逻辑就是每一次都选择当前的最优解,直到得出全局的最优解,但是每一次的局部最优解不能和最终的全局最优解划上等号。这也就是贪心策略的缺点。原创 2022-05-29 22:25:29 · 2350 阅读 · 0 评论 -
数据结构与算法-进阶(十七)回溯
回溯本质就是前进不成,就后退一步换另外一条路继续前进,直到到达目的地。它在树结构、图结构中都有应用。本文通过解决八皇后的问题来了解回溯的思想。原创 2022-05-27 21:31:25 · 113 阅读 · 0 评论 -
数据结构与算法-进阶(十六)递归案例
今天通过一个求解斐波那契数列来看一下递归思想,在多个不同的优化过程中学习递归转换非递归的方式。原创 2022-05-17 21:49:20 · 258 阅读 · 0 评论 -
数据结构与算法-进阶(十五)递归
递归是简化解决问题的思路,减少代码的处理方式。其本质就是将问题不断拆分成同类型的小问题,找到可以直接给出答案的地方时,再不断反推,直到得出原问题的答案。原创 2022-05-11 21:17:51 · 155 阅读 · 0 评论 -
数据结构与算法-进阶(十四)最短路径&Floyd 算法
Floyd 算法是可以计算出任意两个顶点之间的最短路径。它的核心原理基于这样一个共识,即两个顶点之间的最短路径的情况要么是两个顶点之间直接连接,要么就是通过其他顶点连接。原创 2022-04-29 09:42:54 · 890 阅读 · 0 评论 -
数据结构与算法-进阶(十三)最短路径&Bellman-Ford 算法
Bellman-Ford 算法是求单源最短路径的算法,它的核心就是不断松弛边,使得到达其他顶点成为最短路径。这次终于理解了边的松弛操作的本质了,也是可喜可喜原创 2022-04-25 21:11:32 · 298 阅读 · 0 评论 -
数据结构与算法-进阶(十二)最短路径&Dijkstra 算法
理解 Dijkstra 算法,可以想象将石头依次从桌子上提起来的场景,绷直的边就是最短的路径。比较难理解就是松弛操作,需要多思考一些。看来算法也是源于自然和生活啊(没有根据的猜测)!!!原创 2022-04-21 21:37:14 · 652 阅读 · 0 评论 -
数据结构与算法-进阶(十一)图&最短路径
所有的图都是有最短路径的,计算最短路径比较经典的应用场景就是路径规划。最短路径也有它自身的局限性,比如不能出现负权环等。这里先了解最短路径的概况,后面几期将分别介绍求最短路径的几个经典算法。原创 2022-04-20 22:10:41 · 786 阅读 · 0 评论 -
数据结构与算法-进阶(十)生成树& kruskal 算法
Kruskal 是求最小生成树的算法,本质就是依次将权值小的边不断并入最小生成树中。这期间可能会形成环,这里使用并查集的数据结构来避免形成环,这个点是非常巧妙的。原创 2022-04-15 09:31:00 · 376 阅读 · 0 评论 -
数据结构与算法-进阶(九)生成树 & Prim 算法
生成树是一种图的表现形式,它有个简单的规定,就是边的数量等于顶点的数量减一。在有权图中找到最小生成树在很多场景中被应用到。这里主要介绍一种获取最小生成树的方法,即 **Prim**。还有另外一种,下期继续。原创 2022-04-11 18:52:04 · 810 阅读 · 0 评论 -
数据结构与算法-进阶(八)AOV 网
AOV 网是图的一种类型,本质是一个有向无环图。AOV 网的排序被称为拓扑排序,它的实现思路是卡恩算法。代码实现上要留意删除顶点的操作,这是一个很巧妙的处理方式。原创 2022-04-02 10:07:36 · 6081 阅读 · 0 评论 -
数据结构与算法-进阶(七)图的遍历
图的遍历有两种方式,这两种方式和二叉树的层序遍历和前序遍历逻辑是一致的,在实现过程中使用到了队列和栈的数据结构。看本期文章相当于重温一下队列、栈和二叉树的遍历等知识。原创 2022-03-30 20:52:36 · 612 阅读 · 0 评论 -
数据结构与算法-进阶(六)图的接口实现
本期通过实现图的接口函数,来进一步理解在代码中,图的结构是如何形成的,比如怎么定义边、如何定义顶点、如何定义边与顶点的连接关系等等。原创 2022-03-25 19:12:29 · 1259 阅读 · 0 评论 -
数据结构与算法-进阶(五)图的实现
实现图结构的方案大致为邻接矩阵和邻接表,本期就介绍一下这两个方案分别是什么。在最后会处理一下图的基本接口,以及顶点结构和边结构,为下期代码实现做准备。原创 2022-03-23 20:22:03 · 2088 阅读 · 2 评论 -
数据结构与算法-进阶(四)图的分类续
在上期介绍完无向图和有向图之后,延伸出完全图、有权图以及连通图。主要根据边直接连接,还是间接连接,有方向,还是没有方向来区分。其中的有权图在实际生活中可以找到很多对应的场景。原创 2022-03-18 20:27:40 · 846 阅读 · 2 评论 -
数据结构与算法-进阶(三)图
数据结构中第三大分类就是图结构。简单地理解,图就是由顶点和边组成的。根据顶点的分布和边的连接这两种情况,可以分成不同的类型。接下来将介绍图以及它的大致分类。原创 2022-03-16 20:40:09 · 892 阅读 · 2 评论 -
数据结构与算法-进阶(二)并查集的优化
并查集解决的就是快速查找和连接的问题,所以就有在连接(即合并)上的优化和在查找上的优化。不管哪个方面的优化,核心就是降低树的高度,就能减少合并时调整的路径,查找时经过的路径,时间复杂度也就随之降低。原创 2022-03-11 20:58:36 · 1720 阅读 · 0 评论 -
数据结构与算法-进阶(一)并查集
并查集可以快速查找多个点之间是否连接,以及快速连接多个点。并且并查集使用数组的数据结构实现。那么如何利用数组的结构实现?以及为什么能够快速查找和连接呢?文章将给出答案。原创 2022-03-09 11:14:21 · 416 阅读 · 0 评论 -
数据结构与算法-基础(二十二)二叉树的非递归遍历
二叉树的遍历可以用递归的方式简单实现,但是递归也有其局限性,所以非递归实现是否可行?下面的文章就会告诉答案。递归的局限性是什么?文章中也会给出作者的理解。原创 2022-03-04 20:53:45 · 435 阅读 · 0 评论 -
数据结构与算法-基础(二十一)Trie(前缀树)
Trie 被称为前缀树,结构类似树,一个节点有多个子节点,那么在搜索路径中就有多条路,也是高效检索的本质。Trie 的检索和字典查找单词的场景非常相似。原创 2022-03-02 21:14:21 · 529 阅读 · 0 评论 -
数据结构与算法-基础(二十)优先级队列
队列的数据结构保证先进先出特性,优先级队列打破先进先出特性,制定优先级高的先出队规则。依然使用数组的数据结构,并且也要优化遍历和插入操作,就需要满足这两个添加的大顶堆来支持。所以优先级队列基于大顶堆实现是最优的选择。原创 2022-02-25 20:23:21 · 301 阅读 · 0 评论 -
数据结构与算法-基础(十九)堆
堆可以分为大顶堆和小顶堆,是根据节点与子节点的比较来界定。文章中可以使用数组来存放元素,并处理节点与子节点的比较和交换,就是利用了二叉树的基础性质,看完文章相当于再次温习了二叉树的基础性质。原创 2022-02-23 20:17:57 · 399 阅读 · 0 评论 -
数据结构与算法-基础(十八)哈希表
哈希表整体结构就是一个数组,元素的结构是 key-value 形式,因为 key 可以是任意可能类型,那么就需要一个标准性的生成唯一索引方式,所以就引出哈希值这个名称。本文在介绍哈希表时,也着重的说明哈希值,了解哈希值的背景以及生成逻辑,才能更好地理解哈希表。原创 2022-02-18 21:06:22 · 149 阅读 · 0 评论 -
数据结构与算法-基础(十七)映射
映射的数据结构可以用链表、AVL 树或者红黑树中的任何一种来实现,对外实现对映射序列中元素的增、删、改和查等操作。所以通晓链表、AVL 树或者红黑树的底层实现逻辑之后,在顶层实现其他的数据存储序列都能很快的切入和掌握。原创 2022-02-16 10:32:49 · 481 阅读 · 0 评论 -
数据结构与算法-基础(十六)集合
**集合**最重要的特点就是它里面的元素是不会存在重复的,所以集合的内部实现中,添加元素函数是需要先判断是否已经存在这个元素,是代码实现的核心部分。原创 2022-01-06 20:33:40 · 280 阅读 · 0 评论 -
数据结构与算法-基础(十五)红黑树(3)删除元素
红黑树删除节点,和 B 树删除节点的情况非常的接近。理解红黑树删除节点之后的恢复操作前,再过一下 B 树的删除逻辑,这样会更好的理解红黑树的删除逻辑。各种处理操作就不会离开一个主要思想,就是红黑树的 5 条性质。原创 2022-01-05 21:10:23 · 323 阅读 · 0 评论 -
数据结构与算法-基础(十四)红黑树(2)添加元素
红黑树添加元素后,需要根据红黑树的 5 条性质判断是否满足,如果不满足就需要做相应的处理使其依然满足红黑树。分析逻辑和实现代码上面有一些比较巧妙的处理点,很值得学习。原创 2021-12-29 20:33:55 · 915 阅读 · 0 评论 -
数据结构与算法-基础(十三)红黑树(1)概述
红黑树是数据结构中重要的一种结构,其本质是通过定义一些性质,让二叉树分布结构变的相对合理,并在动态添加或者删除的过程中去修复结构。红黑树在搜索、添加、删除这 3 种操作的效率相对比较均衡,所以有很多实际的应用场景。原创 2021-12-24 20:34:59 · 579 阅读 · 0 评论 -
数据结构与算法-基础(十二)B 树
B 树是一种平衡的多路搜索树,在添加、删除和搜索等一些操作上和二叉搜索树是同样的逻辑,除此之外 4 阶 B 树在结构上和红黑树也是相似的。所以了解 B 树,可以更好的切入学习红黑树。原创 2021-12-21 20:27:30 · 492 阅读 · 0 评论 -
数据结构与算法-基础(十一)AVL 树
AVL 树 是最早时期发明的自平衡二叉搜索树之一。是依据它的两位发明者的名称命名。AVL 树有一个重要的属性,即平衡因子(Balance Factor),平衡因子 == 某个节点的左右子树高度差。AVL 树特点总结下来有:每个节点的平衡因子有且仅有 1、0、-1,若超过这三个值的范围,就称其为失衡;每个节点左右子树的高度差不会超过 1;搜索、添加、删除的时间复杂度为 O(logn),n 为 n 个节点。看上图,右侧图中二叉树就可以称为AVL 树。添加后导致失衡若再添加一个元素 18,导原创 2021-10-24 20:21:23 · 143 阅读 · 0 评论 -
数据结构与算法-基础(十)平衡二叉搜索树
摘要二叉搜索树的特性-节点的左侧部分比它小,右侧部分比它大,使得二叉搜索树在查找节点有二分法的效果,也提高了它的添加和删除处理,毕竟添加和删除也是先查找位置,然后再处理。平衡二叉搜索树就是持续保证这样的高效性,进入正题:二叉搜索树在添加或者删除的过程中,在一些场景下退化为链表,比如对比一组数据:7、4、9、2、5、8、11。按照现在的顺序添加和按照数据的大小依次添加的结果:当数据已经有顺序,使用二叉搜索树添加就会变成一个线性链表,这是我们不愿意看到的结果。同理,在删除节点的时候,也是容易多次.原创 2021-10-14 21:06:46 · 134 阅读 · 0 评论 -
数据结构与算法-基础(九)二叉搜索树
摘要如果使用线性表存放 n 个元素时,时间复杂度是 O(n)。如果使用二分法搜索,可以降低时间复杂度,为 O(logn),但是添加和删除的平均时间复杂度是 O(n)。使用二叉搜索树,可以让添加、删除、搜索的最坏时间复杂度优化到 O(logn)。二叉搜索树,英文为 Binary Search Tree,简称 BST。它是二叉树中的一种,应用的场景也是非常广泛,其他地方也叫做二叉查找树、二叉排序树。主要特点有:任意一个节点的值都大于它左子树所有节点的值任意一个节点的值都小于它右子树所有节点的值.原创 2021-10-12 20:30:36 · 82 阅读 · 0 评论 -
数据结构与算法-基础(七)完全二叉树
完全二叉树判断(判断)完全二叉树的叶子节点只会出现最后两层,且最后一层的叶子节点都靠左对齐。根据定义来看,度为 1 的节点只会在左子树,度为 1 的节点要么是 1 个,要么是 0 个。完全二叉树属于二叉树,即每个节点的度最大为 2。度:节点拥有 n 棵子树,就是度为 n。判断完全二叉树之前,需要先编写是否是叶子节点的判断,当节点的左右子节点都是 null 时,这个节点就是叶子节点/** * 是否是叶子节点 * * 通过判断是否 left 和 right 是否都为 null * *原创 2021-09-30 11:47:26 · 179 阅读 · 0 评论 -
数据结构与算法-基础(六)二叉树基础
摘要二叉树是树结构中最基础,也是最重要的结构。由二叉树衍生出多种不同类型的二叉树,当学习完二叉树的不同衍生结构后,会发现,都不能逃离二叉树的定义和特定。树结构生活中会遇到很多树形结构的场景,比如公司的组织架构、文件目录等等。使用树形结构是出于可以提高效率的目的。基本概念树有节点、根节点、父节点、子节点、兄弟节点这几个关键词。树可以没有一个节点,称为空树,也可以只有一个节点,即只有根节点。树也可以分为子树、左子树、右子树。在树的结构中,有以下几个:节点的度:子树的个数树的度:所有节点度中.原创 2021-09-26 20:41:04 · 67 阅读 · 0 评论 -
数据结构与算法-基础(五)队列(Qeque)
队列的定义队列也是一种线性表,只能在头尾两端进行操作,主要特点:队尾:只能从队尾添加元素,叫做入队(enQueue)队头:只能从队头移除元素,叫做出队(deQueue)先进先出元素,First In First Out(FIFO)接口设计根据队列的定义设计接口如下表:函数释义int size()元素数量boolean isEmpty()是否为空void clear()清空void enQueue(E element)入队E dequeue原创 2021-09-24 21:05:23 · 170 阅读 · 0 评论 -
数据结构与算法-基础(四)栈(Stack)
摘要前几期探究过动态数组或者链表后,接下来的栈就可以使用线性表的结构再次封装实现。在实现栈 的时候发现,在线性表的基础上,实现起来更简单。栈这种数据结构应用到很多场景,比如网页之间的跳转等。栈的定义栈是一种特殊的线性表,只能在一端进行操作。栈的主要特点有以下几点:往栈中添加元素的操作,叫作入栈(push)从栈中移除元素的操作,叫做出栈(pop),只能移除栈顶元素栈遵守的是原则是后进先出(Last In First Out,LIFO)栈的接口设计根据栈的特点,可以设计栈的相关接口:.原创 2021-09-19 14:55:27 · 60 阅读 · 0 评论