天天看點

最短路徑之迪傑斯特拉與雙向迪傑斯特拉實驗結果

資料集:City of Oldenburg (OL) Road Network

9組查詢均為相距較遠的結點

最近一直在圍繞雙向迪傑斯特拉轉,對其中重要的優先隊列資料結構,嘗試了用無索引的二叉堆實作、有索引的二叉堆實作以及無索引的斐波那契實作三種方式。其中無索引的優先隊列允許出現相同的節點,而有索引的優先隊列中不允許。不同實作方式運作時間如表2-1所示,其中每個查詢都運作了10000次,機關ms。

表2-1 雙向迪傑斯特拉不同優先隊列實作方式運作結果

查詢

雙向迪傑斯特拉

二叉堆無索引t1

二叉堆有索引t2

t2/t1

斐波那契堆無索引

1

873

1716

1.96

1982

2

4103

8065

11466

3

6615

10842

1.63

17207

4

2106

3448

5460

5

5444

8674

1.59

14804

6

3666

6052

1.65

10046

7

655

1092

1.66

1264

8

4212

6662

1.58

11840

9

6272

9578

1.52

16365

問題1: 無索引的二叉堆比有索引實作優先隊列最短路徑求解快了平均1.7倍。其中對于索引部分嘗試了兩種方式:數組索引與哈希(cmap)索引,兩種方式效果相似。

分析: 建立、調整索引的時間與存儲結點的時間是一樣的,是以加入索引必然增加優先隊列的時間消耗。

另外,對于無索引的優先隊列,相同的結點會同時出現在隊列中。對于相同的節點,先出來的肯定是最小的,當其它結點出來時到該節點的最短路徑已經求出,隻需一次判斷即可。而實際中隻有小于20%的出隊列操作是無效的。

無索引的二叉堆雙向迪傑斯特拉主要函數運作時間分析如圖2-1所示。函數調用關系如圖2-2所示。

最短路徑之迪傑斯特拉與雙向迪傑斯特拉實驗結果

圖2-1 各主要函數運作時間

最短路徑之迪傑斯特拉與雙向迪傑斯特拉實驗結果

圖2-2 重要路徑

對于迪傑斯特拉來說,使用優先隊列比普通方法快近60倍。是以對比中直接忽略該種方式實作的迪傑斯特拉。表3-1列出了查詢時間,其中每組查詢都運作了10000次,其中優先隊列的實作方式為無索引的二叉堆。

表3-1 無索引的雙向迪傑斯特拉與迪傑斯特拉時間對比

迪傑斯特拉

2262

6911

7425

7207

1872

1154

7051

7489

問題2:對于查詢4與查詢7雙向迪傑斯特拉比迪傑斯特拉慢。

分析: 雙向迪傑斯特拉相比于迪傑斯特拉減少了一些結點的最短路徑計算,即減少了處理結點。但是,前者需要多次的加法操作,也消耗了大量的時間。

問題3: 當求解所有點對的最短路徑時,floyd比迪傑斯特拉與雙向迪傑斯特拉都快。

分析: floyd求解的時候不存在重複計算問題;而多次運作單源點最短路徑問題求解所有對的最短路徑時,存在很多重複的計算。是以,求解所有對或者多對最短路徑時floyd算法優于迪傑斯特拉和雙向迪傑斯特拉。

繼續閱讀