単純な(前処理なしで、A* などを用いない)Dijkstra 法は
Andrew V. Goldberg 氏による multi-level buckets を用いたものが早いらしいのだが、
現在までずっと Binary Tree を用いてきたので簡単に乗り換えるのではなく、
一種の悪あがき的に新しいデータ構造に乗り換える前にプロファイルしてみた。
具体的には関数の呼出回数やループをカウントする。
これにより無駄・非効率と思われるコードを最適化できた。
基本的に以下の5つさえあれば十分であるが、
特に[→]で表した3つの関数は全体の実行時間に大きな影響を及ぼす。
・初期化する void BinTreeInit (void)
→・新たにデータを挿入する void BinTreeInsert (int a_pot, int a_num)
→・キーが最小であるデータを取り出す int BinTreeGetMinNode (void)
→・データを削除する void BinTreeDeleteNode (int a_pot, int a_num)
・2分木内のデータを開放する void BinTreeFree (void)
関数呼出のオーバーヘッドも馬鹿にならないので、
「データを開放する」関数以外では再帰呼び出しは用いていない。
shortest path route start at Mon Nov 26 12:40:04 2007
algorithm is dijkstra method
data is ../ShortestPath/data/USA/USA-road-t.USA.grap
query is data/p2p/USA.p2p
mode is p2p & Sorted Graph
node number is 23947347
arc number is 58333344
------profile------
BinTreeInsert() = 21719633
InsertSearch = 357653143
BinTreeGetMinNode() = 20358763
GetMinSearch = 179981007
GetMinSwap = 20358763
BinTreeDeleteNode() = 1357591
DeleteSearch = 20710051
DeleteSearch2 = 231822
DeleteSwap = 1357591
BinTreeFree() = 6559
[ 1/10] 957498-10453327
Distance = 41922812, ScanNode = 20358763, CalcTime : 7411.9[ms]
------profile------
BinTreeInsert() = 4657459
InsertSearch = 75768261
BinTreeGetMinNode() = 4429158
GetMinSearch = 38404289
GetMinSwap = 4429158
BinTreeDeleteNode() = 223056
DeleteSearch = 3338129
DeleteSearch2 = 38833
DeleteSwap = 223056
BinTreeFree() = 10491
[ 2/10] 19200797-7727679
Distance = 8047405, ScanNode = 4429158, CalcTime : 1685.7[ms]
------profile------
BinTreeInsert() = 14375086
InsertSearch = 256352154
BinTreeGetMinNode() = 13443219
GetMinSearch = 129103637
GetMinSwap = 13443219
BinTreeDeleteNode() = 924297
DeleteSearch = 15408115
DeleteSearch2 = 141669
DeleteSwap = 924297
BinTreeFree() = 15141
[ 3/10] 13006257-40639
Distance = 18835334, ScanNode = 13443219, CalcTime : 6392.0[ms]
------profile------
BinTreeInsert() = 14232379
InsertSearch = 229433023
BinTreeGetMinNode() = 13290596
GetMinSearch = 115644903
GetMinSwap = 13290596
BinTreeDeleteNode() = 937115
DeleteSearch = 14076707
DeleteSearch2 = 153597
DeleteSwap = 937115
BinTreeFree() = 9337
[ 4/10] 4314559-22779984
Distance = 36904098, ScanNode = 13290596, CalcTime : 4804.3[ms]
------profile------
BinTreeInsert() = 1038438
InsertSearch = 15196655
BinTreeGetMinNode() = 971469
GetMinSearch = 7223363
GetMinSwap = 971469
BinTreeDeleteNode() = 64025
DeleteSearch = 863560
DeleteSearch2 = 11560
DeleteSwap = 64025
BinTreeFree() = 5889
[ 5/10] 17261435-8424294
Distance = 4202750, ScanNode = 971469, CalcTime : 379.9[ms]
------profile------
BinTreeInsert() = 20339739
InsertSearch = 332226258
BinTreeGetMinNode() = 19042418
GetMinSearch = 166082821
GetMinSwap = 19042418
BinTreeDeleteNode() = 1293387
DeleteSearch = 19604645
DeleteSearch2 = 217896
DeleteSwap = 1293387
BinTreeFree() = 7869
[ 6/10] 8077810-13186938
Distance = 35317539, ScanNode = 19042418, CalcTime : 7049.9[ms]
------profile------
BinTreeInsert() = 8759589
InsertSearch = 142715504
BinTreeGetMinNode() = 8263299
GetMinSearch = 72398087
GetMinSwap = 8263299
BinTreeDeleteNode() = 487996
DeleteSearch = 7312158
DeleteSearch2 = 84456
DeleteSwap = 487996
BinTreeFree() = 16589
[ 7/10] 3048748-1475829
Distance = 16883055, ScanNode = 8263299, CalcTime : 3101.5[ms]
------profile------
BinTreeInsert() = 4809684
InsertSearch = 73649036
BinTreeGetMinNode() = 4511822
GetMinSearch = 38538004
GetMinSwap = 4511822
BinTreeDeleteNode() = 294455
DeleteSearch = 4244206
DeleteSearch2 = 42489
DeleteSwap = 294455
BinTreeFree() = 6815
[ 8/10] 21869636-3531883
Distance = 21836097, ScanNode = 4511822, CalcTime : 1433.8[ms]
------profile------
BinTreeInsert() = 21575235
InsertSearch = 359693596
BinTreeGetMinNode() = 20211716
GetMinSearch = 181259979
GetMinSwap = 20211716
BinTreeDeleteNode() = 1357637
DeleteSearch = 21097667
DeleteSearch2 = 217532
DeleteSwap = 1357637
BinTreeFree() = 11765
[ 9/10] 13446936-4981527
Distance = 42431566, ScanNode = 20211716, CalcTime : 7936.8[ms]
------profile------
BinTreeInsert() = 17216078
InsertSearch = 299413743
BinTreeGetMinNode() = 16118473
GetMinSearch = 151036991
GetMinSwap = 16118473
BinTreeDeleteNode() = 1090377
DeleteSearch = 17693984
DeleteSearch2 = 168372
DeleteSwap = 1090377
BinTreeFree() = 14457
[10/10] 18549540-3230879
Distance = 22838781, ScanNode = 16118473, CalcTime : 7235.9[ms]
File Read Time : 23784.4[ms]
Total Calc Time : 47431.8[ms]