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的內容 一般有兩類 一類是本單位自行開發製作的,另一類是依法或依約定從某些版權擁有者獲得轉授權...