检测两个节点之间是否存在路径的最佳方法是图形?

时间:2018-03-13 17:07:03

标签: algorithm graph

问题的描述如下。

程序将按行读取文件以构建图形。文件中的每一行都是以下三种操作之一:

  1. add x y,这意味着在节点x和y之间添加边,以便形成图形。此图是无向图。
  2. remove x y,这意味着删除节点x和y之间的边,如果它无效(图中似乎不存在x或y,或者x和y之间不存在边),则不执行任何操作。 / LI>
  3. is linked x y,如果x和y可以通过图中的所有边连接,则应该返回。此操作的时间复杂度应该是恒定的时间。
  4. 以下是一个例子:

       add 1 2  
       add 2 3
       is linked 1 3(should be true ,cause there is a path 1-> 2, 2->3)
       add 3 4
       remove 2 3
       is linked 1 4(should be false)
    

1 个答案:

答案 0 :(得分:1)

您可以使用union-find数据结构在接近线性的amortized时间内执行此操作。对于其结构和实现细节,您可以通过路径压缩等级联合google 。您可以通过图画教程和精确的时间/空间复杂性分析找到许多关于此的学术说明。这个linkone可以提供帮助。

但这里有两个注释:

其复杂性是摊销的。如果您想将其与最坏情况分析进行比较,请参阅here

接近线性是什么意思?该算法的摊销分析等于α(n)所指出的逆Ackermann函数。

  

其中α(n){\ displaystyle \ alpha(n)} \ alpha(n)是逆Ackermann函数。该函数的值α(n)<1。 5 {\ displaystyle \ alpha(n)&lt; 5} {\ displaystyle \ alpha(n)&lt; 5}表示可以在此物理世界中写入的任何n值,因此不相交集操作基本上是恒定的时间