[考題] 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