作业帮 > 综合 > 作业

Dijkstra算法的堆优化

来源:学生作业帮 编辑:作业帮 分类:综合作业 时间:2024/05/10 06:35:32
Dijkstra算法的堆优化
不要代码.要打字……
是把dist作为关键字建堆么,一开始堆头是dist[s]=0,其余全是maxlongint,然后按dijkstra的思想搞么?但是这样取出一个元素,最坏情况下要堆其他n个元素进行调整,每次都是logn,这样的话不就退化成O(n*n*logn)了么?求到底怎么优化……
>>全国交通咨询?
作为一个OIer、我表示对最短路径算法稍有研究.
Dijkstra和Floyd是按需要来看的
首先
dijkstra求的是从一个节点到其他节点的最短路 时间复杂度不优化的情况下是n方
Floyd求的是任意两点间的最短路径、时间复杂度永远是n的立方、而且我表示除了邻接矩阵我再没用其他数据结构写过.
所以在处理很多的结点很多边的时候、Floyd又耗费时间又浪费空间、没有特殊需要不要用.
至于dijkstra、在稀疏图里它一定比SPFA快
>>SPFA是另一种最短路算法、是Bellman-Ford的队列优化
但是对于稠密图、SPFA要比dijkstra快很多.
但是、dijkstra可以用堆优化
用小根堆来维护dijkstra中的dist数组、在每次取最小值的时候取堆顶元素
这样时间复杂度是nlogn级、很快
至于SPFA跟Heapdijkstra哪个快这个不大好比较= =、
OTZ回答的有点跑偏了.
注意最开始的那几行
我强烈推荐dijkstra、Floyd如果不求任意两点的最短路径的话根本没必要.

再问: 至于dijkstra、在稀疏图里它一定比SPFA快 Dijkstra的时间复杂度是与点有关的,SPFA的时间复杂度是与边有关的,怎么会在稀疏图里DIjkstra比SPFA快呢? 用小根堆来维护dijkstra中的dist数组、在每次取最小值的时候取堆顶元素 取出一个元素,最坏情况下要堆其他n个元素进行调整,每次都是logn,这样的话不就退化成O(n*n*logn)了么?