关于图算法的时间复杂度取决于什么?

时间:2012-08-09 19:35:39

标签: time-complexity dijkstra prims-algorithm kruskals-algorithm

我在教科书中偶然发现了这个问题:

  

“一般来说,Prim的时间复杂度,Kruskal和Dijkstra的算法取决于什么?”

     

一个。图中的顶点数。
  湾图中的边数。
  C。关于图中顶点数和边数的两者。

     

解释你的选择。

因此根据Wikipedia Prim的说法,Kruskal和Dijkstra的算法最坏情况时间复杂度分别为O(ElogV)O(ElogV)O(E+VlogV)。所以我猜答案是c?但为什么呢?

4 个答案:

答案 0 :(得分:0)

我不知道Prim和Kruskal的情况,也可能是Dijkstra的错,但我认为答案是b,因为:

Dijkstra将在最短的已知路径上访问节点,直到找到目的地为止。

这意味着如果两个边指向同一个节点,算法只会考虑一个,因为一个具有更高的权重或它们是相等的,使得一个边缘没有意义。

因此,通过添加边缘来增加遍历图形所花费的时间的唯一方法是添加节点(在现有节点上添加边可以改变算法的遍历时间但是与边缘量不成比例,只有他们的重量)。

因此,我的直觉是只有节点数量与运行时间直接相关。 Dijkstra's Alogrithm wikipedia page似乎证实了这一点:

  

Dijkstra算法存储的最简单实现   普通链表或数组中集合Q的顶点,并提取   Q的最小值只是对Q中所有顶点的线性搜索   在这种情况下,运行时间为O(E + V ^ 2)或 O(V ^ 2)

这当然只是一种直觉,而cs.stackex可能会更有用。

答案 1 :(得分:0)

答案是(c),因为V和E都有助于各自算法的渐近复杂性。现在,在进一步的分析中,人们可能会认为V对Kruskal和Prim的影响要小得多(因为它是对数因子)。但在所有三种情况下,E似乎几乎具有相同的权重。

另外,请注意| E | < = | V | ^ 2总是(对于简单的图表)

答案 2 :(得分:0)

在最坏的情况下,图形将是完整的图形,即v(v-1)/ 2个边缘,即e>> v和e~v ^ 2

Prim's和Dijkstra算法的时间复杂度为:
1.具有邻接列表和优先级队列:
    O((v + e)log v)在最坏的情况下:e>> v so O(e log v)
2.使用矩阵和优先级队列:
      WC e~v ^ 2中的O(v ^ 2 + e log v)     所以O(v ^ 2 + e log v)~O(e + e log v)~O(e log v) 3.当图形变得更密集时(最坏情况是完整图形)我们使用斐波那契堆     和邻接表:O(e + v log v)

kruskal的时间复杂度是最差情况下的O(e log e)e~v ^ 2 所以log(v ^ 2)= 2 log v

所以我们可以肯定地说,O(e log e)可以是O(2e log v) 即最坏情况下的O(e log v)。

答案 3 :(得分:0)

正如您所说,O(ElogV),O(ElogV)和O(E + VlogV)的时间复杂度意味着每个依赖于E和V。这是因为每种算法都需要考虑边沿和边沿。它们在图表中的权重。由于对于Prim和Kruskal而言,必须连接MST并包括所有顶点,而对于Dijkstra而言,最短路径必须从一个顶点通过其他中间顶点传递到另一个顶点,因此在每种算法中都必须考虑这些顶点。

例如,使用Dijkstra的算法,您实质上是在寻求添加成本低且连接顶点的边,这些顶点最终将提供从起始顶点到结束顶点的路径。要找到最短的路径,您不能只寻找将起始顶点连接到终点的路径,也不能只寻找最小的加权边,您需要同时考虑两者。由于您同时考虑了边和顶点,因此在整个算法中进行这些考虑所需的时间将取决于边的数量和顶点的数量。

另外,通过三种算法的不同实现可能会导致不同的时间复杂度,并且分析每种算法都需要同时考虑E和V。

例如,Prim的算法为O(V ^ 2),但可以通过使用基于最小堆的优先级队列进行改进,以达到您发现的复杂度:O(ElogV)。 O(ElogV)似乎是更快的算法,但并非总是如此。 E可以等于V ^ 2,因此在具有接近V ^ 2边缘的密集图中,O(ElogV)变为O(V ^ 2)。如果V非常小,则O(V ^ 2)和O(ElogV)之间不会有太大差异。 E和V还基于图形的存储方式影响运行时间。例如,对于密集图(E接近V ^ 2),邻接表变得效率很低,因为检查图中是否存在边从接近O(1)变为O(V)。