查找图形直径的时间复杂度


27

找到图的直径的时间复杂度是 多少?G=(V,E)

  • O(|V|2)
  • O(|V|2+|V||E|)
  • O(|V|2|E|)
  • O(|V||E|2)

图的直径是图中所有顶点对之间的最短路径距离的集合中的最大值。G

我不知道该怎么办,我需要对如何解决这样的问题进行完整的分析。


4
请详细说明。为什么您要关注这个问题?您是否需要提示,完整的分析或参考?您对最坏情况或平均情况下的时间感兴趣吗?是定向的吗?G
拉斐尔

@Raphael:显然我不需要提示,我需要完整的分析。我还是编辑了问题。
Gigili 2012年

1
@Gigili你的意思是在所有情况下对不对?否则,所有条件都归于最后一种可能性(在等于一般图形上),这使它成为正确答案,并假定至少有一个答案是正确的。另一个需要注意的是,在带有循环的图中,没有最长的路径。什么是“最长距离”?ΘO(|V|5)
拉斐尔

@Gigili四个选择从哪里来?
乌里2012年

Answers:


5

更新:

此解决方案不正确。

不幸的是,该解决方案仅对于树木是正确的(而且很简单)!查找树木的直径甚至不需要这样做。这是图形的反例(直径为4,如果选择此,则算法返回3 ):v

在此处输入图片说明


如果有向图是很复杂的,那么有一篇论文声称在密集情况下比对所有对最短路径使用算法更快的结果。

但是,我的主要观点是关于该图定向且具有非负的weigth的情况,我多次听到一个不错的技巧:

  1. 选择一个顶点v
  2. 查找使得是最大d v u ud(v,u)
  3. 求使最大d u w wd(u,w)
  4. 返回d(u,w)

它的复杂度与两个连续的广度优先搜索¹相同,即如果图形已连接²,则为。O(|E|)

这似乎是民间传说,但现在,我仍在努力获取参考证明其正确性。当我实现这些目标之一时,我将进行更新。看来如此简单,我现在就发布我的答案,也许有人会更快地得到它。

¹如果图形加权,维基百科似乎会说但我只能确定。O | E | log | V |O(|E|+|V|log|V|)O(|E|log|V|)

²如果未连接图形,则得到但可能必须添加才能从每个连接的组件中选择一个元素。我不确定是否有必要,无论如何,在这种情况下,您可以决定直径是无限的。O(|V|+|E|)O(α(|V|))


为了使Dijsktra在指定的时间范围内工作,您需要使用Fibonacci堆,而不是通常的实现。
Suresh'3

8
这是完全错误的答案,该算法是民俗学,但在树中不是通用图。PS:我可以看到您的反例,但是将其标记为答案不是一个好的答案。

对于错误的解决方案,我有两个问题。1.这至少会给出一个正确答案必须在的范围吗?例如,如果该方法找到直径d,则正确的解是否在d2d之间?2.如果添加另一个间接并考虑该间接找到的所有节点(而不仅仅是一个),会发生什么?帖子中给出的反例将起作用,因为真正的外围顶点在第二个间接发现的节点之间。
mafu

32

我想你指的是直径的这是最长的最短路径中发现的。GG

通过首先找到所有对最短路径并确定找到的最大长度,可以找到直径。Floyd-Warshall算法在时间执行此操作。可以实现Johnson算法来实现时间。Θ(|V|3)O(|V|2log|V|+|V||E|)

似乎很难实现更小的最坏情况运行时范围,因为要考虑距离,并且要在亚线性(摊销)时间内计算这些距离将很困难;请参阅此处了解相关范围。注意纸,它使用不同的方法,并获得(略)更快的算法。O(|V|2)


2
如果您在这些论文中遇到了麻烦,请查看Google学术搜索。
拉斐尔

另外,对于无向树,可以在其中获得dia的情况也应注意此异常。仅进行一次DFS遍历。
azam

15

您还可以考虑代数图理论方法。直径是最小整数 st,矩阵具有所有项都不为零的属性。您可以通过矩阵乘法的次迭代找到。然后,直径算法需要时间,其中是矩阵乘法的界。例如,随着Vassilevska Williams对Coppersmith-Winograd算法的推广,直径算法将在。有关快速入门的信息,请参见此处的 Fan Chung的书的第3章。diam(G)tM=I+AMttO(logn)O(M(n)logn)M(n)O(n2.3727logn)

如果将注意力集中在合适的图类上,则可以在最佳时间内解决APSP问题。这些类别至少包括区间图,圆弧图,置换图,二部置换图,强弦图,弦二部图,距离遗传图和双弦图。例如,请参见Dragan,FF(2005)。估计受限图族中所有对的最短路径:统一方法。Journal of Algorithms,57(1),1-21及其参考。O(n2)


2
值得注意的是,该算法仅适用于未加权情况。
GMB 2015年

-2

假设:
1.图未加权
2.图是有向的

O(| V || E |)时间复杂度。

算法:

ComputeDiameter(G(V,E)):
  if ( isCycle( G(v,E) ) ) then
     return INFINITY
  if ( not isConnected( G(V,E) )) then
     return INFINITY
  diameter = 0
  for each vertex u in G(V,E):
     temp = BFS(G,u)
     diameter = max( temp , diameter )
  return diameter

说明:
我们检查周期。如果图包含循环,那么我们将继续在循环中移动,因此我们将拥有无限距离。我们检查是否已连接。如果未连接图形,则意味着从G1到G2的顶点v的顶点u。其中G1和G2是未连接的任何两个子图。因此,我们将再次拥有无限距离。我们将使用BFS计算从u可以到达的给定节点(u)到所有其他节点(v)之间的最大距离。然后,我们将采用先前计算的最大直径,并通过BFS返回结果。因此,我们将拥有当前的最大直径。

运行时间分析:

  1. 使用DFS的O(| E |)
  2. 使用DFS的O(| E |)
  3. BFS在O(| E |)时间运行。
  4. 我们必须为每个顶点调用BFS函数,因此总共需要O(| V || E |)时间。

总时间= O(| v || E |)+ O(| E |)+ O(| E |)
因为| V || E | > | E |
因此我们将运行时间设为O(| v || E |)。

BFS
DFS

注意:这不是解决此问题的理想方法。


非循环连接图是树,问题更容易出现(因为直径是由最长路径给出的)。在这里这里已经处理过这里给出了更快的算法。(一个递归遍历或两个BFS就足够了。)
Raphael

1
@Raphael不,无环无向图是树。DAG是DAG。
David Richerby 2015年

@DavidRicherby对。(尽管,从技术上讲,答案并没有说明是否排除了有向或无向循环。;)。无论如何,这无非是解决APSPP(朴素的方法),以前的答案已经在一般情况下解决了。
拉斐尔

@Raphael您确定非循环图是树吗?图是非循环的并不意味着图将始终是树。Tree只是这种情况的特例。这也是简单的算法,时间复杂度为O(| V || E |)。
sonus21 2015年

是,我确定。(也许您正在考虑植根的树木,这是另一种味道。)
拉斐尔
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.