heap dijkstra與SPFA的對比

2021-04-26 19:50:04 字數 2589 閱讀 9351

heap+dijkstra與spfa都是單源最短路的高效演算法,到底誰比較快一直各有各的說法。於是心血來潮自己測試了下。

測試工具:cena 0.6

系統: windows vista

cpu: t2130, 1.86ghz

所有程式中,圖用相同格式儲存,輸入,輸出,資料都是靜態分配

鄰接表參考dd的dinic**

dijkstra1: 我寫的的支援內部修改的heap, 

複雜度o((v+e)logv)

dijkstra2: stl的priority_queue,更新之後結點直接加進堆中而不是更新堆內的結點

複雜度: ???

dijkstra3: 樸素的dijkstra

複雜度o(v^2+e)

spfa:        經典的bellmen-ford的優化,用的最常見的寫法,自己寫的queue   

複雜度o(k*e), k接近2

usaco:       usaco中butter一題的標程稍作修改,本質與dijkstra1相似, 

複雜度o((v+e)logv)

test 1:2000個點的完全圖

輸入輸出用時:2.15-2.9秒, 平均:2.47

用時(除去平均輸入輸出時間)

單位:秒:

dijkstra1: 0.13  0.10

dijkstra2: 0.05  0.41

dijkstra3: 0.21  0.18

spfa:        1.04  0.97

usaco:       0.29  0.40

大規模密集圖,大量資料的輸入輸出占用了大部分時間。單純計算時間太短難以比較。幾種dijkstra都有很好的表現,spfa由於執行時間對於邊數的依賴性,顯得遜色不少。

對於dijkstra1和dijkstra2 因為是密集圖,每次找到乙個點後無論是內部更新還是重新插入結點,都要o(log n)的複雜度(雖然插入結點的期望複雜度為o(1),但是由於是重新插入結點,堆內同時存在的總結點數可能會達到e的數量級,增大了常數),工作量都是較大的,堆的優勢沒有體現出來。 相比之下,樸素的dijkstra的表現相當不錯。

test 2: 100000個結點的鏈狀圖

輸入輸出用時:0.10 - 0.30秒, 平均:0.17

用時(除去平均輸入輸出時間)

單位:秒:

dijkstra1: 0.03  0.07

dijkstra2: 0.04  0.07

dijkstra3: >10   >10

spfa:        0.03  0.00

usaco:       0.15  0.18

對於極端的鏈狀圖,spfa無疑是最合適的了。每個結只進隊一次,標準的o(e)。樸素的dijkstra對於這樣的圖就力不從心了:每次迴圈都過一遍結點,在鬆弛,然後發現每次o(v)的時間只鬆弛了乙個點。。

dijkstra2 由於堆內的結點總數最多有e的數量級,稀疏圖里和v接近,劣勢沒有體現出來。

test 3: 20000個結點的稀疏圖(每個點100條邊)

輸入輸出用時:2.15-2.40 秒, 平均:2.30

用時(除去平均輸入輸出時間)

單位:秒:

dijkstra1: 0.30  0.33

dijkstra2: 0.39  0.57

dijkstra3: 2.20  3.26

spfa:        5.45  5.11

usaco:       0.27  0.33

普通的稀疏圖,比test 2的密集。 dijkstra+heap依然是最快的。

比較驚奇的結果是:spfa居然會比樸素dijkstra還慢……有些出乎預料

原因還沒想明白……

test 3: 5000個結點的較密集圖(每個點500條邊)

輸入輸出用時:2.44-2.99 秒, 平均:2.75

用時(除去平均輸入輸出時間)

單位:秒:

dijkstra1: 0.30  0.32

dijkstra2: 0.39  0.33

dijkstra3: 0.40  0.40

spfa:        1.04  1.04

usaco:       0.40  0.19

比較密集的圖。spfa的表現仍然不佳,dijkstra+heap 任然是王道,樸素dijkstra的劣勢逐漸縮小

總結:dijkstra1對於各種圖都有良好表現,但是程式設計複雜度較高,需要準備模板。dijkstra2速度也很不錯,普遍略遜於dijkstra1。dijkstra3對於密集圖有不錯的表現。

spfa表現不盡如人意。但是由於spfa程式設計複雜度低,適用於各種圖,也可以用來負權環,適合比賽使用。

程式設計複雜度:spfa>***** dijkstra>stlheap+dijkstra>heap+dijkstra(越靠前越容易是寫)

綜合效率:   heap+dijkstra>stlheap+dijkstra> spfa>***** dijkstra

比賽的時候 stlheap+dijkstra 和 spfa 是不錯的選擇

dijkstra1:

dijkstra2:

dijkstra3:

spfa:

usaco:

android 字型大小 與 sp 轉換

字型大小與 sp轉換 36號此為36 號字的大小 字型大小的單位是 pt 1 72 英吋 如果ui給字型大小的單位是畫素1號字 1px px 1 dpi 在 android 中文字大小建議使用 sp,方便適配。換算方法如下 公式 px pt dpi 72 pt px 72 dpi pt 約等於 2....

SP與CP的合作模式

1 產品由cp完全策劃和製作,sp直接買斷cp產品獨家所有權 2 產品由cp完全策劃和製作,sp買斷cp的產品的使用權,但是不是獨家 3 sp提供文稿和創意,由cp進行專業製作,產品製作完成後所有權歸sp擁有,sp付給cp相關的製作費用 4 產品內容由cp完全策劃和製作,cp只負責提供產品內容及產品...

SP是什麼 CP是什麼?SP與CP有什麼區別?

1 什麼是sp?2 什麼是cp?cp是英文content provider的縮寫,中文翻譯為內容提供商。通常是指為電信運營商 包括固定網 移動網 網際網路或其他資料網運營商 提供內容服務的社會合作單位。cp的內容 一般有兩類 一類是本單位自行開發製作的,另一類是依法或依約定從某些版權擁有者獲得轉授權...