fbpx
维基百科

Kosaraju算法

Kosaraju算法(也被称为Kosaraju–Sharir算法)是一个在线性时间内寻找一个有向图中的强连通分量的算法。阿尔佛雷德·艾侯约翰·霍普克洛夫特杰弗瑞·乌尔曼相信该算法来自S·拉奥·科萨拉朱英语S. Rao Kosaraju于1978年撰写的一篇未发表论文之中[1]米卡·夏尔英语Micha Sharir也独立发现了该算法并于1981年将其发表[2]。该算法巧妙地利用了一个定理:「一个图的反向图和原图具有一样的强连通分量」。

简介

该算法主要用于枚举图中每一个强连通分量内的所有顶点。该算法可由以下四部分组成[3]

  1. 对有向图 取逆,得到 的反向图 
  2. 利用深度优先搜索求出 的逆后排序
  3.  按照上述逆后排序的序列进行深度优先搜索
  4. 同一个深度优先搜索递归子程序中访问的所有顶点都在同一个强连通分量内

Java代码实现

public class KosarajuAlgorithm { private boolean[] marked; private int[] id; private int count=-1; private Stack<Integer> reversePostOrder; public KosarajuAlgorithm(Digraph G){ //G.V()返回有向图G的边数 marked=new boolean[G.V()]; id=new int[G.V()]; //G.reverse()返回的为G的反向图 Digraph G_reverse=G.reverse(); //本遍循环是将G的反向图的逆后序排列存储在reversePostOrder中 for(int i=0;i<G_reverse.V();i++){ if(!marked[i]){ dfs(G_reverse,i); } } count=0; //按照G的反向图的逆后排序进行深度优先搜索 for(int i:reversePostOrder){ if(!marked[i]){ dfs(G,i); count++; } } } //深度优先搜索 public void dfs(Digraph G,int v){ marked[v]=true; id[v]=count; for(int i:G.adj(v)){ if(!marked[i]){ dfs(G,i); } } reversePostOrder.push(v); } } 

复杂度

当图是使用邻接表形式组建的,Kosaraju算法需要对整张图进行了两次的完整的访问,每次访问与顶点数 和边数 之和 成正比,所以可以在線性时间 内访问完成。该算法在实际操作中要比Tarjan算法基于路径的强连通分量算法英语Path-based strong component algorithm要慢,这两种算法都只需要对图进行一次完整的访问。

当图是使用邻接矩阵形式组建的,算法的时间复杂度为 

参考

  1. ^ Alfred V. Aho, John E. Hopcroft, Jeffrey D. Ullman. Data Structures and Algorithms. Addison-Wesley. 1983. ISBN 978-0201000238.  ,p222--p230
  2. ^ Micha, Sharir. A strong-connectivity algorithm and its applications in data flow analysis. Computers & Mathematics with Applications. 1981, (7): 67–72 [2016-02-03]. (原始内容于2019-04-13). 
  3. ^ Robert Sedgewick, Kevin Wayne. 算法. 北京: 人民邮电出版社. 2012年10月. ISBN 978-7-115-29380-0.  ,p379--p380

文献及链接

  • ([//web.archive.org/web/20190413115618/http://www.sciencedirect.com/science/article/pii/0898122181900080 页面存档备份,存于互联网档案馆) Micha Sharir.A strong connectivity algorithm and its applications to data flow analysis. Computers and Mathematics with Applications 7(1):67–72, 1981]]
  • Kosaraju's的简要介绍与证明(页面存档备份,存于互联网档案馆

kosaraju算法, 也被称为kosaraju, sharir算法, 是一个在线性时间内寻找一个有向图中的强连通分量的算法, 阿尔佛雷德, 艾侯, 约翰, 霍普克洛夫特和杰弗瑞, 乌尔曼相信该算法来自s, 拉奥, 科萨拉朱, 英语, kosaraju, 于1978年撰写的一篇未发表论文之中, 米卡, 夏尔, 英语, micha, sharir, 也独立发现了该算法并于1981年将其发表, 该算法巧妙地利用了一个定理, 一个图的反向图和原图具有一样的强连通分量, 目录, 简介, java代码实现, 复杂度, 参考,. Kosaraju算法 也被称为Kosaraju Sharir算法 是一个在线性时间内寻找一个有向图中的强连通分量的算法 阿尔佛雷德 艾侯 约翰 霍普克洛夫特和杰弗瑞 乌尔曼相信该算法来自S 拉奥 科萨拉朱 英语 S Rao Kosaraju 于1978年撰写的一篇未发表论文之中 1 米卡 夏尔 英语 Micha Sharir 也独立发现了该算法并于1981年将其发表 2 该算法巧妙地利用了一个定理 一个图的反向图和原图具有一样的强连通分量 目录 1 简介 1 1 Java代码实现 2 复杂度 3 参考 4 文献及链接简介 编辑该算法主要用于枚举图中每一个强连通分量内的所有顶点 该算法可由以下四部分组成 3 对有向图G displaystyle G 取逆 得到G displaystyle G 的反向图G R displaystyle G R 利用深度优先搜索求出G R displaystyle G R 的逆后排序 对G displaystyle G 按照上述逆后排序的序列进行深度优先搜索 同一个深度优先搜索递归子程序中访问的所有顶点都在同一个强连通分量内Java代码实现 编辑 public class KosarajuAlgorithm private boolean marked private int id private int count 1 private Stack lt Integer gt reversePostOrder public KosarajuAlgorithm Digraph G G V 返回有向图G的边数 marked new boolean G V id new int G V G reverse 返回的为G的反向图 Digraph G reverse G reverse 本遍循环是将G的反向图的逆后序排列存储在reversePostOrder中 for int i 0 i lt G reverse V i if marked i dfs G reverse i count 0 按照G的反向图的逆后排序进行深度优先搜索 for int i reversePostOrder if marked i dfs G i count 深度优先搜索 public void dfs Digraph G int v marked v true id v count for int i G adj v if marked i dfs G i reversePostOrder push v 复杂度 编辑当图是使用邻接表形式组建的 Kosaraju算法需要对整张图进行了两次的完整的访问 每次访问与顶点数V displaystyle V 和边数E displaystyle E 之和V E displaystyle V E 成正比 所以可以在線性时间O V E displaystyle O V E 内访问完成 该算法在实际操作中要比Tarjan算法和基于路径的强连通分量算法 英语 Path based strong component algorithm 要慢 这两种算法都只需要对图进行一次完整的访问 当图是使用邻接矩阵形式组建的 算法的时间复杂度为O V 2 displaystyle O V 2 参考 编辑 Alfred V Aho John E Hopcroft Jeffrey D Ullman Data Structures and Algorithms Addison Wesley 1983 ISBN 978 0201000238 使用 accessdate 需要含有 url 帮助 引文格式1维护 日期与年 link p222 p230 Micha Sharir A strong connectivity algorithm and its applications in data flow analysis Computers amp Mathematics with Applications 1981 7 67 72 2016 02 03 原始内容存档于2019 04 13 引文格式1维护 日期与年 link Robert Sedgewick Kevin Wayne 算法 北京 人民邮电出版社 2012年10月 ISBN 978 7 115 29380 0 使用 accessdate 需要含有 url 帮助 p379 p380文献及链接 编辑 web archive org web 20190413115618 http www sciencedirect com science article pii 0898122181900080 页面存档备份 存于互联网档案馆 Micha Sharir A strong connectivity algorithm and its applications to data flow analysis Computers and Mathematics with Applications 7 1 67 72 1981 Kosaraju s的简要介绍与证明 页面存档备份 存于互联网档案馆 取自 https zh wikipedia org w index php title Kosaraju算法 amp oldid 69223662, 维基百科,wiki,书籍,书籍,图书馆,

文章

,阅读,下载,免费,免费下载,mp3,视频,mp4,3gp, jpg,jpeg,gif,png,图片,音乐,歌曲,电影,书籍,游戏,游戏。