【问题标题】:Best way to detect if a path exists between two nodes a graph?检测图的两个节点之间是否存在路径的最佳方法?
【发布时间】:2018-08-22 01:10:56
【问题描述】:

问题描述如下。

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

  1. add x y,意思是在节点x和y之间添加一条边,这样就形成了一个图。此图是无向图。
  2. remove x y,表示删除节点 x 和 y 之间的一条边,如果它无效(x 或 y 在图中似乎不存在或 x 和 y 之间不存在边),则什么也不做。
  3. is linked x y,如果 x 和 y 可以通过图中的所有边连接,则应该返回。此操作的时间复杂度应该是常数时间。

这是一个例子:

   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)

【问题讨论】:

  • 我不明白你在问什么。编辑您的帖子以澄清它。
  • 寻找连接的组件?您是否有要搜索的连接组件的规格?或者你只是想看看图表是否有“n”个连接的组件?你想在恒定时间内做到这一点吗?我不这么认为。
  • 您对添加和删除操作有时间限制吗?否则,您可以在每次更新图表时构建一个布尔连接矩阵。然后可以在恒定时间内检查连接性,添加和删除的成本会上升。

标签: algorithm graph


【解决方案1】:

您可以在amortized 接近线性的时间使用联合查找数据结构来执行此操作。对于它的结构和实现细节,你可以用谷歌搜索使用路径压缩按等级排列的联合。您可以通过图形教程和精确的时间/空间复杂度分析找到许多关于此的学术笔记。这个link 和这个one 可以提供帮助。

这里有两个注意事项:

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

什么是接近线性?该算法的摊销分析等价于由α ( n ) 记下的阿克曼反函数。

其中 α ( n ) {\displaystyle \alpha (n)} \alpha (n) 是反阿克曼函数。对于可以写在这个物理宇宙中的任何 n 值,这个函数的值 α ( n )

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-03-06
    • 1970-01-01
    • 2021-12-10
    • 2016-03-04
    • 1970-01-01
    • 1970-01-01
    • 2021-12-18
    • 1970-01-01
    相关资源
    最近更新 更多