将COMP20003中关于Graph的内容进行总结,内容来自COMP20003,中文术语并不准确,以英文为准。


Graph G = {V, E}

  顶Vertices V: can contain information

  边Edges E (links between vertices): can have direction and/or weight

种类:

  •   有向图(directed graph):边(edge)有方向。

    • 弱有向连接图Weakly connected directed graph:将有向的边替换成无向的边后能得到无向连通图。

    

    • 强有向连接图Strongly connected directed graph:在有向图中,任意顶通过边到达任意顶。

    

      • Strongly connected components in a directed graph:在同一区域(component)的顶可以到达所有同一区域的顶。

        

  •   无向图(undirected graph):边(edge)没有方向。

    • 无向连通图Connected Undirected graph: 任意的顶均可通过边连接到其他顶,包括间接。

    

    • 无向非连通图Unconnected Undirected graph:即不是无向连通图Connected Undirected graph。

    

完全图Complete graph:每个顶能直接到其他顶。对于无向图至少需要V(V-1)/2个顶,有向图至少需要V(V - 1)个顶。


用数据结构表示:

用二维数组(Matrix)表示:

注意:未连接用无穷大表示,而不是用0表示。

复杂度O(V2)

用链表表示:

复杂度O(V + E)


图的遍历Traversal

Depth-first search(DFS)深度优先搜索,使用stack实现,基于stack先进后出的特性。

Breadth first search(BFS)广度优先搜索,使用queue实现,基于queue先进先出的特性。


图的拓扑:应用于有向无环图(Directed Acyclic Graphs,简称DAG)

  Topological sort: a partial ordering that fulfils certain constraints. All edges e(i, j) go in horizontal i -> j direction

                            变成水平排列,只能从左边指向右边。

  

  拓扑涉及的概念:

    indegree:该顶被边到达的次数。

    outdegree:由该顶开始边连接的次数。

  能有拓扑结构,DAG图必须满足有一个source(indegree为0)和sink(outdegree为0)。

  如果在DAG图中存在汉密尔顿路径(Hamiltonian path,即从某个顶开始通过边不重复的经过所有点的路径,想想游戏一笔画),则该拓扑是唯一的。

  代码:https://github.com/Will-Zhu-27/Algorithms-and-Data-Structures/tree/master/graph/Topological%20sort


算法:

Dijkstra's algorithm for single source shortest path

Dijkstra单源最短路径算法:一个顶到其他顶的最短路径。

基于Greedy algorithm: 最短路径中的子路径也是最短路径,即A到Y的最短路径经过X,那么该路径中从A到X的部分是A到X的最短路径。

假定没有负值的边。

使用优先队列priority queue。

步骤:

  使用变量数组dist记录从目标定到该顶的最短距离,数组pred记录经过该顶的前一个顶,edgeWeight(a, b):顶a到顶b边的值。

    1. 将dist自己到自己为0,其余最大(MAX_INT)。pred均为NULL。
    2. 将所有顶装入优先队列,按照对应的dist值的大小为优先度。
    3. 当优先队列不为空时,pop一个顶a,为空则结束。
    4. LOOP:如果dist[a] + edgeWeight(a, b) < dist[b],b为跟顶a有边连接的顶,则更新顶b的信息:dist[b] = dist[a] + edgeWeight(a, b),pred[b] = a,更新优先队列中的顺序(也可pop时再根据有限度pop)。
    5. 步骤3。

    复杂度分析:

    

    实现代码:https://github.com/Will-Zhu-27/Algorithms-and-Data-Structures/tree/master/graph/shortestPaths/dijkstra

Warshall algorithm for transitive closure -- unconnected directed graph

Warshall算法:用于判断有向图中顶与顶之间是否能通过边联通(包括间接的)。

  用二维数组储存基础(直接)边连接的信息,使用三次循环。

  

    其中i for intermediate, s for source, t for to,循环变量怎么命名的并不重要,重要的是最外圈的循环变量i必须作为判断的中间变量,改变它的位置会导致算法出错。我的理解为:算法是基于贪心算法,

    当循环到 i 时,就要得到通过 0 到 i 是否有最短路径,然后逐渐增大i达到在全部顶中的最短路径。此问题也可看在知乎上的这个问题的回答:https://www.zhihu.com/question/30955032

Floyd-Warshall algorithm for all pairs shortest paths

Floyd-Warshall算法:图中每个顶到其他顶的最短路径。

  在Warshall的基础上稍作改变,二维数组储存的是顶之间weight的信息。

  

同样的,最外圈的循环变量i必须作为判断的中间变量!另外用C实现时,虽然图里不连接用了∞表示, C中用 INT_MAX / 2 表示, 因为if 判断时会产生数据溢出问题。

要记录路径也只要加个二维数组记录即可。

复杂度:θ(V3)

代码:https://github.com/Will-Zhu-27/Algorithms-and-Data-Structures/tree/master/graph/AllPairsShorestPaths/Floyd-Warshall

Floyd-Warshall和dijkstra在计算all pairs shorest paths上的优劣:

  循环V次dijkstra也可得到全部顶的最短路径,复杂度为:O((V2 + V * E)logV)

  Floyd-Warshall复杂度为θ(V3)。

  对于sparse graph with positive edge weights(V>>E),Dijkstra用于all pair shortest path更好

    对于dense graph with positive edge weights(E>>V) Floyd-Warshall更好

  


最小生成树 Minimum Spanning Tree, MST

  要求:

    undirected weighted graphs

    Graph must be connected   无向非连通图

  MST特点:

    包括所有的顶

    minimum sum of edge weights,包含连接顶的边和最小,数量为V-1

    MST中没有循环(cycles)。

  简言之,使用最小weight的edge将所有顶连接到。

  

  如果所有的edge的weight不同,那么MST是唯一的。

  计算MST的算法有Prim和Kruskal。

  Prim:通过添加下一个最近的顶完成MST。

    需要使用优先队列。

    

    准备:dist[V]初值MAX,pred[V]初值NULL,inMst[V]初值FALSE。

    步骤:

    1. 将某一顶 (随便那个)作为起始点root,dist[ root ] = 0。将全部顶enqueue优先队列,以dist为优先级。
    2. pop一个顶a,所有与a直接相连的顶b:如果inMst[b]==FALSE && a到b的edge < dist[b],则更新dist[b]等于该edge,更新pred[b]=a,调整优先队列中的顺序。
    3. inMst[a] = TRUE;
    4. 优先队列为空->结束, 不为空->步骤2

    若手工计算,以a为起始点为例,与a相连的有b和c,到b更短,选b。

    

    将a和b作为一个整体,与整体相连的有c、d、e,c和d到整体(最短)都是8,随便选一个,选c。

    

    将a和b和c作为一个整体,与整体相连的有e、d、f,到整体最短的是f,选f。

    

    将a和b和c和f作为一个整体,与整体相连的有e、d、g,到整体最短的是d,选d。

    

    

    将a和b和c和f和d作为一个整体,与整体相连的有e、g,到整体最短的是g,选g。

    

    将a和b和c和f和d和g最为一个整体,与整体相连的有e,选e。

    

    复杂度分析:

  

    从算法步骤可以看出复杂度是与V有关的,所以Prim更适合dense graph(E>>V)。

    代码:https://github.com/Will-Zhu-27/Algorithms-and-Data-Structures/tree/master/graph/Minimum%20Spanning%20Tree/Prim

  Kruskal:通过添加最短的且不构成回路的边完成MST

    需要使用优先队列和Union-find 结构。

    Union-find 结构:所有的顶都各自为一个集合,如果因为E[a][b](连接顶a和顶b)是mst中的话,则a和b所在的集合合并,可以以数组表示如下图。

    

    也可以用树的形式表示,以树的形式表示的话,在进行union合并操作时,注意时将小的树并入大的树中。

    步骤:

      1.将所有边根据weight入列优先队列。将所有顶装入union-find结构。

      2.从优先队列中取出一条边E[a][b](weight最小的)。

      3.如果a和b在同一集合中,则步骤2。如果不再同一集合中,则a和b所在的集合合并,E是mst的一条边。

      4.当mst边的数量< V - 1,步骤2。

    若手工计算,以下图为例:

    

      E[a][b](或者是E[c][e],只要不构成回路,选哪个都行)为mst中的边。

      

      E[c][e]为mst中的边。

      

      E[b][c]为mst中的边。

      

      E[c][f]为mst中的边。

      

      E[g][f]为mst中的边。

      

      E[d][f]为mst中的边,不能是E[c][g]或E[a][e]会构成回路。

      

      已经过所有的顶,mst完成。

    代码:https://github.com/Will-Zhu-27/Algorithms-and-Data-Structures/tree/master/graph/Minimum%20Spanning%20Tree/Kruskal

  

    

    

Graph图总结的更多相关文章

  1. 133. Clone Graph(图的复制)

    Given the head of a graph, return a deep copy (clone) of the graph. Each node in the graph contains ...

  2. [图解tensorflow源码] Graph 图优化 (graph optimizer)

  3. [图解tensorflow源码] Graph 图构建 (Graph Constructor)

  4. [图解tensorflow源码] Graph 图模块 —— Graph Loading

  5. [图解tensorflow源码] Graph 图模块 (UML视图)

  6. zabbix 面板graph图上没有数据显示

    1. 问题: zabbix_server日志出现大量如下错误: query failed: [1526] Table has no partition for value 1507509984 2. ...

  7. HTTP协议漫谈 C#实现图(Graph) C#实现二叉查找树 浅谈进程同步和互斥的概念 C#实现平衡多路查找树(B树)

    HTTP协议漫谈   简介 园子里已经有不少介绍HTTP的的好文章.对HTTP的一些细节介绍的比较好,所以本篇文章不会对HTTP的细节进行深究,而是从够高和更结构化的角度将HTTP协议的元素进行分类讲 ...

  8. 图数据库对比:Neo4j vs Nebula Graph vs HugeGraph

    本文系腾讯云安全团队李航宇.邓昶博撰写 图数据库在挖掘黑灰团伙以及建立安全知识图谱等安全领域有着天然的优势.为了能更好的服务业务,选择一款高效并且贴合业务发展的图数据库就变得尤为关键.本文挑选了几款业 ...

  9. 图数据库 Nebula Graph 在 Boss 直聘的应用

    本文首发于 Nebula Graph 官方博客:https://nebula-graph.com.cn/posts/nebula-graph-risk-control-boss-zhipin/ 摘要: ...

随机推荐

  1. 不使用 webpack,vuejs 异步加载模板

    webpack 打包不会玩,整了这么个小玩具 一段 vue 绑定代码,关键点在 gmallComponent 1.异步加载外部 vue 文件(非 .vue) 2.按一定规则拆分 template.sc ...

  2. 使用 ASP.NET Core MVC 创建 Web API(二)

    使用 ASP.NET Core MVC 创建 Web API 使用 ASP.NET Core MVC 创建 Web API(一) 六.添加数据库上下文 数据库上下文是使用Entity Framewor ...

  3. 4.3dotnet watch run「深入浅出ASP.NET Core系列」

    希望给你3-5分钟的碎片化学习,可能是坐地铁.等公交,积少成多,水滴石穿,谢谢关注. dotnet run的麻烦 如果您使用的是vs code进行跨平台开发,那么dotnet watch run对你的 ...

  4. 【设计模式+原型理解】第一章:使用Javascript来巧妙实现经典的设计模式

    刚开始学习设计模式之前,我是没想说要学习设计模式的,我只是因为想学习JS中的原型prototype知识,一开始我想JS中为什么要存在原型这个东西?于是慢慢通过原型而接触到设计模式,后来发现我这个过程是 ...

  5. 【大数据安全】Kerberos集群安装配置

    1. 概述 Kerberos是一种计算机网络认证协议,它允许某实体在非安全网络环境下通信,向另一个实体以一种安全的方式证明自己的身份.它也指由麻省理工实现此协议,并发布的一套免费软件.它的设计主要针对 ...

  6. 【转载】java 中变量的存储位置

    原文链接点这里,感谢博主分享 * 寄存器:最快的存储区, 由编译器根据需求进行分配,我们在程序中无法控制. * 栈:存放基本类型的变量数据和对象的引用,但对象本身不存放在栈中,而是存放在堆(new 出 ...

  7. [Nodejs] node写个hello,world

    http 模块 与 hello world hello world let http = require("http"); http .createServer((request, ...

  8. asp.net mvc 简单项目框架的搭建过程(一)对Bll层和Dal层进行充分解耦

    学习asp.net 已经有近三个月的时间了,在asp.net mvc上花的时间最多,但个人真是有些菜,不得不说,asp.net mvc的水真的还是蛮深的.目前在公司实习,也见过公司几个项目的代码了.对 ...

  9. SQLServer存储过程编写规则

    SQLServer编写规则 1.  存储过程 a)         在程序应用中,对于数据库“写”操作的功能通过存储过程来实现. b)        存储过程命名: SP_+表名(+功能名) 对于一个 ...

  10. <自动化测试方案_7>第七章、PC端UI自动化测试

    第七章.PC端UI自动化测试 UI自动化测试又分为:Web自动化测试,App自动化测试.微信小程序.微信公众号UI层的自动化测试工具非常多,比较主流的是UFT(QTP),Robot Framework ...