为什么堆优化 dijkstra 算法时间复杂度为(n+m)logn
  • 板块学术版
  • 楼主smallC233
  • 当前回复10
  • 已保存回复10
  • 发布时间2021/9/13 21:36
  • 上次更新2023/11/4 06:51:28
查看原帖
为什么堆优化 dijkstra 算法时间复杂度为(n+m)logn
296919
smallC233楼主2021/9/13 21:36

rt,之前看到有人提问过,但是并没有理解,百度了很久大部分也都只给了结论而没有证明,只能来请教一下各位大佬麻烦帮忙解答一下疑惑。

目前综合百度,书本和同学讨论大概的理解是:在堆优化下找到每个最小的点的时间复杂度是 O(n logn),边一共被遍历 m 次。在最优情况下时间复杂度为 O(n logn + m)。考虑到进行松弛操作的时候都会往堆里重复加入元素,在最劣情况下(每次遍历边都进行松弛),堆里会有 n + m 个元素,时间复杂度为O((n + m)logn),不知道这样理解对不对。感觉把最劣情况作为时间复杂度有点奇怪,所以觉得是我的理解出错了QAQ

//堆优化Dijkstra参考代码
q.push(make_pair(0,s));
dis[s] = 0;
while(!q.empty())
{
    int x = q.top().second;
    q.pop();
    if(vis[x]) continue;
    vis[x] = 1;
    for(int i = head[x]; i; i = Next[i])
    {
        int y = ver[i], w = edge[i];
        if(dis[x] + w < dis[y])
        {
            dis[y] = dis[x] + w;
            q.push(make_pair(dis[y], y));
        }
    }
}

2021/9/13 21:36
加载中...