ここから取得したペアリングヒープの C++ での実装を試しています 。 ://home.fnal.gov/~stoughto/build/graphviz-2.22.2/lib/vpsc/pairingheap/PairingHeap.cpp
その PairingHeap を std::priority_queue と比較した結果は次のとおりです。
gcc 4.7 -O3、コア i7 2.4Ghz rdstc 命令でサイクルを測定
-------------------------------------------------------------------------------
for 100.000 elements:
o std::priority_queue<int>
- insert: 9,800,415 cycles
- extract: 29,712,818 cycles
- total: 39,513,233 cycles [0.031secs]
o PairingHeap<int>
- insert: 34,381,467 cycles
- extract: 259,986,113 cycles
- total: 294,367,580 cycles [0.125secs]
-------------------------------------------------------------------------------
for 1.000.000 elements:
o std::priority_queue<int>
- insert: 95,954,533 cycles
- extract: 518,546,747 cycles
- total: 614,501,280 cycles [0.296secs]
o PairingHeap<int>
- insert: 344,453,782 cycles
- extract: 3,856,344,199 cycles
- total: 4,200,797,981 cycles [1.593secs]
-------------------------------------------------------------------------------
for 10.000.000 elements:
o std::priority_queue<int>
- insert: 999,836,450 cycles
- extract: 10,634,407,049 cycles
- total: 11,634,243,499 cycles [4.390secs]
o PairingHeap<int>
- insert: 3,441,903,781 cycles
- extract: 61,166,421,272 cycles
- total: 64,608,325,053 cycles [24.187secs]
ペアリング ヒープは std::priority_queue よりも高速である必要があります。操作が漸近的に高速になるはずですが、代わりに、ここではペアリング ヒープが非常に遅くなります。これは、std::priority_queue が内部でベクトルを使用するためだと思います。これは、ペアリング ヒープのように、整数ごとにノードを割り当てるよりもはるかにキャッシュ フレンドリーです。
それで、私の質問は次のとおりです。キャッシュにはるかに適しているという理由だけで、漸近的に優れたデータ構造が悪いものに(大部分)打ち負かされる可能性がありますか?デフォルトの std::priority_queue がそれよりも大幅に高速になる可能性がある場合、ペアリング ヒープなどのより複雑なデータ構造に多くの時間を費やす価値はありますか?
私が使用した Pairing ヒープの実装がただのがらくただとは考えていませんでしたが、そうではないようです。私が試した他の実装はさらに悪いからです! 考え?