Dijkstra堆实现算法的复杂性

时间:2019-03-10 04:30:22

标签: algorithm graph

在CRLS的书中,对Dijkstra算法的分析如下:

您需要使用多少次堆?一次从堆中提取每个节点(即CRLS的书中的Extract-Min)--- O(N);而且每次查看边缘---- O(E)时,您可能都需要更改距离(即CRLS的书中的Decrease-Key),这意味着要固定堆顺序。并且每个堆操作都需要O(logN)工作。

因此,总时间复杂度:O((N + E)logN),如果可以从源到达所有顶点,则为O(ElogN)。

我的问题是: 如果从源头可以到达所有顶点,为什么复杂度变为O(ElogN)?为什么我们可以忽略O((N + E)logN)的O(NlogN)部分?

2 个答案:

答案 0 :(得分:2)

如果从源可到达所有顶点,则图形中至少有N-1条边,因此E >= N-1N = O(E)O((N + E) log N) = O((E + E) log N) = O(E log N)

答案 1 :(得分:2)

如果所有节点都已连接,则必须至少有N-1个边。因此E> = N-1,因此N <= E + 1和N + E <= 2E + 1在O(E)中。