[考题] 103高考资讯处理-资料结构第6题

楼主: yearndeath (终于说出口。)   2014-09-06 18:05:05
我好像摸出一点头绪了,回来自问自答XD
若 G=(U,E)为一权重图(weighted graph),每条边的权重均不为负数,则单源最短路径
问题(Single Source Shortest Path Problem)可以用著名的 Dijkstra 算法求得,
回答下列问题:
(一)说明 Dijkstra 算法的主要观念。
(二)Dijkstra 算法在最差情况下(Worst Case Analysis),下列三个功能 Insert、
Delete、Decrease_Key 各自需要执行的次数,可用 Big-Oh 符号表示。
(三)若是要在O(|E|+|V|log|V|)最差情况分析下的时间内执行 Dijkstra 算法,请问该
选择使用那种资料结构,并说明其原因。
第(二)小题>>
Insert Delete Decrease_Key
高点答案 O(|V|) O(|V|) O(|E|)
公职王答案 O(1) O(VlogV) O(1)
问题1:想请问哪个答案才是正确的?
以下我原来的想法(深蓝色的部分)是错的!
我自己是偏向高点的答案,
因为题目有说是在最差情况下的执行次数,
而 Dijkstra 算法的资料结构如为一般heap,
insert/delete/decrease_key,所需花费的时间都是O(log n),
如使用F-heap,除了delete依旧需要O(log n),
其余的所需花的时间都是O(1),
所以依题意我比较可以理解高点的答案.
后来再我多翻了几次参考书,还是一样偏向高点的答案,
但原因跟上面不一样.
我新的想法是:
1.Dijkstra算法可分为
Insert 用于加入新选择的点
Delete 用于选出离出发点边最小的点
Decrease_key 用于检查边,更新最短距离
2.Dijkstra算法如果使用资料结构:邻接串行 + Fibonacci heaps(F-heaps)
每次执行时间和执行次数为
每次执行时间 执行次数
Insert O(log|V|) O(|V|)
Delete O(1) O(|V|)
Decrease_key O(1) O(|E|)
3.总时间 = 每次执行时间*执行次数
= O(log|V|)*O(|V|) + O(1)*O(|V|) + O(1)*O(|E|)
= O(|V|log|V|+|V|+|E|) |V|太小可省略
= O(|E|+|V|log|V|)
从上面三点可以发现,
高点的答案是执行次数,
公职王的答案则是每次执行时间,
所以我觉得高点的答案比较切合题意!
而其中第三点可以回答第(三)小题,
如果所花总时间为O(|E|+|V|log|V|),
资料结构应为邻接串行 + Fibonacci heaps
问题2:另外想请问为什么Decrease_Key的时间复杂度是O(|E|)?
应该说Decrease_Key的执行次数是O(|E|),
因为Decrease_Key是用在"用于检查边,更新最短距离",
所以执行次数为边的总和.
作者: gary22204 (大头蛇)   2014-09-06 18:24:00
最后一个问题,dijkstra在找下个最小权重的点时好像是用min-heap,已经建好了取出来就照数量取这样,然后在考场上我这题全部都用猜的XDDDD
作者: icefresh (冰凉一下)   2014-09-06 18:38:00
decrease key印象中有三种时间 O(E),E*O(logV),E*O(1)我不是很确定 要回去翻以前考研究所的笔记才能确定
楼主: yearndeath (终于说出口。)   2014-09-07 11:00:00
谢谢G大和I大 :))G大有提到找最小权重的点 我想应该是delete而非decrease_key decrease_key是用在检查边 找最短路径
作者: gary22204 (大头蛇)   2014-09-07 11:11:00
好像是欸,抱歉讲错了qq,太久没读书...
楼主: yearndeath (终于说出口。)   2014-09-07 12:23:00
没关系啦 我很开心你可以回应我XD 可以一起讨论啊~
作者: after1 (aaaaaaaaaaaa)   2014-09-07 20:39:00
完了 我就连自己写过这题都忘了当时好像直接跳过这题了 XD

Links booklink

Contact Us: admin [ a t ] ucptt.com