知识梳理
李歘歘
某不知名学院毕业生、非知名厂打工人
展开
-
拓扑排序
如果一个有向图的任意顶点都无法通过一些有向边回到自身,那么称这个有向图为有向无环图(Directed Acyclic Graph,DAG)。拓扑排序是将有向无环图G的所有顶点排成一个线性序列,使得对图G中的任意两个顶点u、v,如果存在边u->v,那么在序列中uー定在v前面。这个序列又被称为拓扑序列。具体做法可以抽象为:①定义一个队列Q,并把所有入度为0的结点加入队列。②取队首...原创 2020-02-20 12:09:09 · 431 阅读 · 0 评论 -
kruskal算法
kruskal算法(读者可以将其读作“克鲁斯卡尔算法”)同样是解决最小生成树问题的一个算法。和prim算法不同,kruskal算法采用了边贪心的策略,其思想极其简洁,理解难度比prim算法要低很多。kruskal算法的基本思想为:在初始状态时隐去图中的所有边,这样图中每个顶点都自成一个连通块。之后执行下面的步骤:①对所有边按边权从小到大进行排序。②按边权从小到大测试所有边,如果当前...原创 2020-02-18 12:09:07 · 4050 阅读 · 3 评论 -
最小生成树——prim算法
最小生成树(Minimum Spanning Tree,MST)是在一个给定的无向图G(V,E)中求一棵树T,使得这棵树拥有图G中的所有顶点,且所有边都是来自图G中的边,并且满足整棵树的边权之和最小。下图给出了一个图G及其最小生成树T,其中较粗的线即为最小生成树的边。可以看到,边AB、BC、BD包含了图G的所有顶点,且由它们生成的树的边权之和为6,是所有生成树中权值最小的。最小生成树有3...原创 2020-02-15 10:59:53 · 13117 阅读 · 1 评论 -
Floyd算法
最短路径是图论中一个很经典的问题:给定图G(V,E),求一条从起点到终点的路径,使得这条路径上经过的所有边的边权之和最小。对任意给出的图G(V,E)和起点S、终点T,如何求从S到T的最短路径。解决最短路径问题的常用算法有Dijkstra算法、Bellman-Ford算法、SPEA算法和Floyd算法。Floyd算法(读者可以将其读作“弗洛伊德算法”)用来解决全源最短路问题,即对给定的...原创 2020-02-14 15:54:17 · 1056 阅读 · 0 评论 -
Bellman--Ford算法和SPFA算法
最短路径是图论中一个很经典的问题:给定图G(V,E),求一条从起点到终点的路径,使得这条路径上经过的所有边的边权之和最小。对任意给出的图G(V,E)和起点S、终点T,如何求从S到T的最短路径。解决最短路径问题的常用算法有Dijkstra算法、Bellman-Ford算法、SPEA算法和Floyd算法。Dijkstra算法可以很好地解决无负权图的最短路径问题,但如果出现了负权边,Dijk...原创 2020-02-14 13:32:21 · 1219 阅读 · 0 评论 -
图的遍历
图的遍历是指对图的所有顶点按一定顺序进行访问,遍历方法一般有两种:深度优先搜索(DFS)和广度优先搜索(BFS)。关于DFS和BFS以及在树中的应用请参考从树的遍历看DFS和BFS深度优先搜索(DFS)广度优先搜索(BFS)下面把它们应用于图的遍历中。1.深度优先搜索(DFS)深度优先搜索以“深度”作为第一关键词,每次都是沿着路径到不能在前进时才退回到最近的岔道口。...原创 2020-02-11 16:09:27 · 1030 阅读 · 0 评论 -
图的定义和存储
1.图的定义图,顾名思义就是地图一样的东西。抽象出来看,图由顶点(Vertex)和边(Edge)组成,每条边的两端都必须是图的两个顶点(可以是相同的顶点)。而记号G(V,E)表示图G的顶点集为V、边集为E。图一般来说,图可分为有向图和无向图。有向图的所有边都有方向,即确定了顶点到顶点的一个指向;而无向图的所有边都是双向的,即无向边所连接的两个顶点可以互相到达。在一些问题中,可以把无向图当作...原创 2020-02-10 17:01:58 · 890 阅读 · 0 评论 -
哈夫曼树和哈夫曼编码
1.哈夫曼树叶子结点的路径长度是指从根结点出发到达该结点所经过的边数。把叶子结点的权值乘以其路径长度的结果称为这个叶子结点的带权路径长度。另外,树的带权路径长度( Weighted PathLength of Tree,WPL)等于它所有叶子结点的带权路径长度之和。已知n个数,寻找一棵树,使得树的所有叶子结点的权值恰好为这n个数,并且使得这棵树的带权路径长度最小。带权路径长度最小的...原创 2020-02-07 23:25:34 · 2584 阅读 · 0 评论 -
堆及堆排序
1.堆的定义和基本操作堆是一棵完全二叉树,树中每个结点的值都不小于(或不大于)其左右孩子结点的值。其中,如果父亲结点的值大于或等于孩子结点的值,那么称这样的堆为大顶堆,这时每个结点的值都是以它为根结点的子树的最大值;如果父亲结点的值小于或等于孩子结点的值,那么称这样的堆为小顶堆,这时每个结点的值都是以它为根结点的子树的最小值。堆一般用于优先队列的实现,而优先队列默认情况下使用的是大顶堆,因此本...原创 2020-02-06 15:39:37 · 793 阅读 · 0 评论 -
并查集
1.定义并查集是一种维护集合的数据结构,它的名字中“并”、“査”、“集”分别取自Union(合并)、Find(査找)、Set(集合)这3个单词。也就是说,并查集支持下面两个操作:①合并:合并两个集合。②査找:判断两个元素是否在一个集合。那么并査集是用什么实现的呢?其实就是用一个数组:int father[N];其中fahter[i]表示元素i的父亲结点,而父亲结点本身也是...原创 2020-02-05 17:57:19 · 1328 阅读 · 0 评论 -
平衡二叉树(AVL)
1.定义平衡二叉树使树的高度在每次插入元素后仍然能保持O(logn)的级别,这样能让查询操作仍然是O(logn)的时间复杂度。平衡二叉树由前苏联两位数学家GM.Adele-Velskil和E.M.Landis提出,因此一般也称作AVL树。AVL树仍然是一棵二叉査找树,只是在其基础上增加了“平衡”的要求。所谓平衡是指,对AVL树的任意结点来说,其左子树与右子树的高度之差的绝对值不超过1,其中...原创 2020-02-04 12:31:45 · 1295 阅读 · 0 评论 -
二叉查找树(BST)
1.定义二叉查找树( Binary Search Tree,BST)是一种特殊的二叉树,又称为排序二叉树、二叉搜索树、二叉排序树。二叉査找树的递归定义如下:①要么二叉査找树是一棵空树。②要么二叉查找树由根结点、左子树、右子树组成,其中左子树和右子树都是二叉查找树,且左子树上所有结点的数据域均小于或等于根结点的数据域,右子树上所有结点的数据域均大于根结点的数据域。从二叉査找树的定义中...原创 2020-02-04 00:01:15 · 1070 阅读 · 0 评论 -
从树的遍历看DFS和BFS
1.深度优先搜索(DFS)和树的先根遍历事实上,对所有合法的DFS求解过程,都可以把它画成树的形式,此时死胡同等价于树中的叶子结点,而岔道口等价于树中的非叶子结点,并且对这棵树的DFS遍历过程就是树的先根遍历的过程。于是可以从中得到启发:碰到一些可以用DFS做的题目,不妨把一些状态作为树的结点,然后问题就会转换为直观的对树进行先根遍历的问题。如果想要得到树的某些信息,也可以借用DFS以深度作为...原创 2020-02-03 11:55:58 · 973 阅读 · 0 评论 -
大学三年来,学开发我用它们。
软件三年走来,基本靠学长带加自学,这一路走来学到了不少书本之外的知识,在这里,我和大家分享一下这三年来,我私藏的学习网站和练手网站。1.在线教学视频网站互联网相关专业的学习当然要靠互联网,这里有我这三年用来学习的视频网站,感谢这些网站:(1)慕课网慕课网-程序员的梦工厂。慕课网是很多程序员自学的起点,这里有很多免费的学习资源,这里肯定能找到有适合你的知识,而且有一个好处,慕课网...原创 2019-12-14 16:59:09 · 36204 阅读 · 10 评论 -
树与二叉树
1.树的定义与性质(1)树(tree)的概念在数据结构中,树则是用来概括传递关系的一种数据结构。为了简化,数据结构中把树枝分叉处、树叶、树根抽象为结点(node),其中树根抽象为根结点(root),且对一棵树来说最多存在一个根结点;把树叶概括为叶子结点(leaf),且叶子结点不再延伸出新的结点;把茎干和树枝统一抽象为边(edge),且一条边只用来连接两个结点(一个端点一个)。这样,树就被定...原创 2019-10-10 20:15:32 · 1496 阅读 · 0 评论