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

Time complexity 图算法的时间复杂度取决于什么?,time-complexity,dijkstra,prims-algorithm,kruskals-algorithm,Time Complexity,Dijkstra,Prims Algorithm,Kruskals Algorithm,我在课本上偶然发现了这个问题: “一般来说,Prim、Kruskal和Dijkstra算法的时间复杂度取决于什么?” a。图形中的顶点数。 B图形中的边数。 C这两个参数都取决于图中顶点和边的数量 解释你的选择 因此,根据维基百科Prim的说法,Kruskal和Dijkstra的算法最坏情况下的时间复杂度分别是O(ElogV),O(ElogV)和O(E+VlogV)。所以我猜答案是c?但是为什么呢?我不知道普里姆和克鲁斯卡尔的情况,可能对迪杰斯特拉的情况是错误的,但我认为在这种情况下答案应该是b

我在课本上偶然发现了这个问题:

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

a。图形中的顶点数。
B图形中的边数。
C这两个参数都取决于图中顶点和边的数量

解释你的选择


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

我不知道普里姆和克鲁斯卡尔的情况,可能对迪杰斯特拉的情况是错误的,但我认为在这种情况下答案应该是b,因为:

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

这意味着,如果两条边指向同一个节点,算法将只考虑其中一条,因为其中一条具有更高的权重或它们相等,从而使一条边无法跟随

因此,通过添加边来增加遍历图所需时间的唯一方法是添加节点(在现有节点上添加边可以更改算法的遍历时间,但它与边的数量不成正比,只与它们的权重成正比)

因此,我的直觉是,只有节点的数量与运行时间直接相关。政府似乎证实了这一点:

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


当然,这只是一种直觉,可能更有用。

我不知道Prim和Kruskal的情况,Dijkstra的情况可能是错误的,但我认为在这种情况下,答案应该是b,因为:

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

这意味着,如果两条边指向同一个节点,算法将只考虑其中一条,因为其中一条具有更高的权重或它们相等,从而使一条边无法跟随

因此,通过添加边来增加遍历图所需时间的唯一方法是添加节点(在现有节点上添加边可以更改算法的遍历时间,但它与边的数量不成正比,只与它们的权重成正比)

因此,我的直觉是,只有节点的数量与运行时间直接相关。政府似乎证实了这一点:

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

当然,这只是一种直觉,可能更有用。

答案是(c),因为V和E都会导致各自算法的渐进复杂性。现在,在进一步的分析中,有人可能会说,V在Kruskal和Prim上要小得多(因为它是对数因子)。但在这三种情况下,E的权重几乎相同

另外,请注意| E |答案是(c),因为V和E都会导致各自算法的渐近复杂性。现在,在进一步的分析中,有人可能会说,V在Kruskal和Prim上要小得多(因为它是对数因子)。但在这三种情况下,E的权重几乎相同


另外,请注意,最坏情况下的| E |图将是一个完整的图,即v(v-1)/2边,即E>>v和E~v^2

Prim和Dijkstra算法的时间复杂度为:
1.具有邻接列表和优先级队列:
最坏情况下的O((v+e)logv):e>>vso(e logv)
2.具有矩阵和优先级队列:
wce~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)~v^2 所以log(v^2)=2 log v

所以我们可以有把握地说O(e loge)可以是O(2e logv)
最坏情况下的ie O(e log v)。最坏情况下的图将是一个完整的图,即e v(v-1)/2边,即e>>v和e~v^2

Prim和Dijkstra算法的时间复杂度为:
1.具有邻接列表和优先级队列:
最坏情况下的O((v+e)logv):e>>vso(e logv)
2.具有矩阵和优先级队列:
wce~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)~v^2 所以log(v^2)=2 log v

所以我们可以有把握地说O(e loge)可以是O(2e logv)
正如你所说,O(ElogV)、O(ElogV)和O(e+VlogV)的时间复杂性意味着每一个都依赖于e和v。这是因为每一个算法都需要考虑图中的边和它们各自的权重。因为对于Prim和Kruskal,MST必须连接并包含所有顶点,而对于Dijkstra,最短路径必须通过其他中间顶点从一个顶点传递到另一个顶点,所以在每个算法中也必须考虑顶点

例如,使用Dijkstra的算法,您实际上希望添加成本低且连接顶点的边,这些顶点最终将提供从起始顶点到结束顶点的路径。要查找最短路径,您不能只查找连接起点顶点到终点的路径,也不能只查找最小的加权边,您需要: