跳至主要內容
图 - AOE & 关键路径

图 - AOE & 关键路径

关键路径在项目管理计算工期等方面有广泛等应用,提升工期就是所见缩减所有关键路径上的工期,并且在实现时需要应用到之前拓扑排序的算法(前提: 有向无环图,有依赖关系)。

关键路径相关名词

相关术语:

  • AOV网络(Activity On Vertex Network): 有向图,用顶点表示活动,用弧表示活动的先后顺序
  • AOE网络(Activity On Edge): 有向图,用顶点表示事件,用弧表示活动,用权值表示活动消耗时间(带权的有向无环图)
  • 活动: 业务逻辑中的行为,用边表示
  • 事件: 活动的结果或者触发条件
  • 关键路径: 具有最大路径长度(权重)的路径,可能不止一条
  • 活动的两个属性: e(i)最早开始时间,l(i)最晚开始时间
  • 事件的两个属性: ve(j)最早开始时间,vl(j)最晚开始时间

gavin-james大约 3 分钟算法和数据结构数据结构
图 - 拓扑排序(Topological sort)

图 - 拓扑排序(Topological sort)

拓扑排序主要用来解决有向图中的依赖解析(dependency resolution)问题。

拓扑排序介绍

对于任何有向图而言,其拓扑排序为其所有结点的一个线性排序(对于同一个有向图而言可能存在多个这样的结点排序)。该排序满足这样的条件——对于图中的任意两个结点u和v,若存在一条有向边从u指向v,则在拓扑排序中u一定出现在v前面。

例如一个有向无环图如下:

img
img

gavin-james大约 4 分钟算法和数据结构数据结构
图 - 最短路径(Dijkstra & Frolyd)

图 - 最短路径(Dijkstra & Frolyd)

最短路径有着广泛的应用,比如地图两点间距离计算,公交查询系统,路由选择等。

最短路径介绍

最短路径问题是图论研究中的一个经典算法问题,旨在寻找图(由结点和路径组成的)中两结点之间的最短路径。最短路径不一定是经过边最少的路径,但在这些最短路径中,长度最短的那一条路径上只有一条边,且它的权值在从源点出发的所有边的权值最小。

从图中某一顶点(称为源点)到达另一顶点(称为终点)的路径可能不止一条,如何找到一条路径使得沿此路径上各边上的权值总和达到最小,例: 公交查询系统。


gavin-james大约 4 分钟算法和数据结构数据结构
图 - 最小生成树(Prim & Kruskal)

图 - 最小生成树(Prim & Kruskal)

Kruskal算法是从最小权重边着手,将森林里的树逐渐合并;prim算法是从顶点出发,在根结点的基础上建起一棵树。

最小生成树相关名词

  • 连通图: 在无向图中,若任意两个顶点vivi与vjvj都有路径相通,则称该无向图为连通图。
  • 强连通图: 在有向图中,若任意两个顶点vivi与vjvj都有路径相通,则称该有向图为强连通图。
  • 连通网: 在连通图中,若图的边具有一定的意义,每一条边都对应着一个数,称为权;权代表着连接连个顶点的代价,称这种连通图叫做连通网。
  • 生成树: 一个连通图的生成树是指一个连通子图,它含有图中全部n个顶点,但只有足以构成一棵树的n-1条边。一颗有n个顶点的生成树有且仅有n-1条边,如果生成树中再添加一条边,则必定成环。
  • 最小生成树: 在连通网的所有生成树中,所有边的代价和最小的生成树,称为最小生成树。

gavin-james大约 3 分钟算法和数据结构数据结构
图 - 遍历(BFS & DFS)

图 - 遍历(BFS & DFS)

图的深度优先搜索(Depth First Search),和树的先序遍历比较类似; 广度优先搜索算法(Breadth First Search),又称为"宽度优先搜索"或"横向优先搜索"。

深度优先搜索

深度优先搜索介绍

它的思想: 假设初始状态是图中所有顶点均未被访问,则从某个顶点v出发,首先访问该顶点,然后依次从它的各个未被访问的邻接点出发深度优先搜索遍历图,直至图中所有和v有路径相通的顶点都被访问到。 若此时尚有其他顶点未被访问到,则另选一个未被访问的顶点作起始点,重复上述过程,直至图中所有顶点都被访问到为止。


gavin-james大约 18 分钟算法和数据结构数据结构
图 - 基础和Overview

图 - 基础和Overview

图(Graph)是由顶点和连接顶点的边构成的离散结构。在计算机科学中,图是最灵活的数据结构之一,很多问题都可以使用图模型进行建模求解。例如: 生态环境中不同物种的相互竞争、人与人之间的社交与关系网络、化学上用图区分结构不同但分子式相同的同分异构体、分析计算机网络的拓扑结构确定两台计算机是否可以通信、找到两个城市之间的最短路径等等。

图的基础

定义

图(Graph)是由顶点的有穷非空集合和顶点之间边的集合组成,通常表示为: G(V,E),其中,G表示一个图,V是图G中顶点的集合,E是图G中边的集合。


gavin-james大约 9 分钟算法和数据结构数据结构
树 - 前缀树(Trie Tree)

树 - 前缀树(Trie Tree)

Trie,又称字典树、单词查找树或键树,是一种树形结构,是一种哈希树的变种。典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。它的优点是:利用字符串的公共前缀来减少查询时间,最大限度地减少无谓的字符串比较,查询效率比哈希树高。

什么是前缀树

在计算机科学中,trie,又称前缀树或字典树,是一种有序树,用于保存关联数组,其中的键通常是字符串。与二叉查找树不同,键不是直接保存在节点中,而是由节点在树中的位置决定。一个节点的所有子孙都有相同的前缀,也就是这个节点对应的字符串,而根节点对应空字符串。一般情况下,不是所有的节点都有对应的值,只有叶子节点和部分内部节点所对应的键才有相关的值。


gavin-james大约 8 分钟算法和数据结构数据结构
树 - 哈夫曼树(Huffman Tree)

树 - 哈夫曼树(Huffman Tree)

哈夫曼又称最优二叉树, 是一种带权路径长度最短的二叉树。(注意带权路径WPL是指叶子节点,很多网上的文章有误导)

哈夫曼树相关名词

先看一棵哈夫曼树: (哈夫曼树推理是通过叶子节点,所以理解的时候需要忽略非叶子节点,很多文章在这点上有误导)

img
img

gavin-james大约 7 分钟算法和数据结构数据结构
树 - 红黑树(R-B Tree)

树 - 红黑树(R-B Tree)

红黑树(Red Black Tree) 是一种自平衡二叉查找树,是在计算机科学中用到的一种数据结构,典型的用途是实现关联数组,是平衡二叉树和AVL树的折中。

提示

红黑树的讲解在JDK TreeMap&TreeSet源码解读中有详细的展示 。这里再补充一些其它内容。

为什么要有红黑树

我们在上一篇博客认识到了平衡二叉树(AVLTree),了解到AVL树的性质,其实平衡二叉树最大的作用就是查找,AVL树的查找、插入和删除在平均和最坏情况下都是O(logn)。AVL树的效率就是高在这个地方。如果在AVL树中插入或删除节点后,使得高度之差大于1。此时,AVL树的平衡状态就被破坏,它就不再是一棵二叉树;为了让它重新维持在一个平衡状态,就需要对其进行旋转处理, 那么创建一颗平衡二叉树的成本其实不小. 这个时候就有人开始思考,并且提出了红黑树的理论,那么红黑树到底比AVL树好在哪里?


gavin-james大约 2 分钟算法和数据结构数据结构
树 - 平衡二叉树(AVL)

树 - 平衡二叉树(AVL)

平衡二叉树(Balanced Binary Tree)具有以下性质:它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。平衡二叉树的常用实现方法有红黑树、AVL、替罪羊树、Treap、伸展树等。 最小二叉平衡树的节点的公式如下 F(n)=F(n-1)+F(n-2)+1 这个类似于一个递归的数列,可以参考Fibonacci数列,1是根节点,F(n-1)是左子树的节点数量,F(n-2)是右子树的节点数量。

什么是AVL树


gavin-james大约 19 分钟算法和数据结构数据结构