在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)部分?
答案 0 :(得分:2)
如果从源可到达所有顶点,则图形中至少有N-1
条边,因此E >= N-1
,N = 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)中。