web-dev-qa-db-ja.com

リストを整理する最も効率的/最速の方法は何ですか?

私はダイクストラの経路探索アルゴリズムをJavaScriptに実装しました。その大部分は、ノードまでの距離を保存し、最小のものをフェッチすることです。距離は頻繁に変化し、最も短い距離が頻繁に取得されます。

私は現在、順序付けられたリンクリストを使用しており、アイテムは追加されたときに順番に並べられます。

より速い方法はありますか?

編集:

更新:

アルボウのフィボナッチヒープの提案を実装しました。 32〜85倍高速でした減少すると、データセットが大きくなります。

値が削除されるたびに統合を実行しないことにより、真のフィボナッチヒープから逸脱しました。 50シフトごとに1回実行すると最高のパフォーマンスが得られます。

ソースコードはこちら: https://github.com/nojacko/dijkstras-js/blob/bda68d1274629c30b1f902ffb7f95f1e3c695973/Dijkstras.js

3
James Jackson

それが本当に順序付けられたリンクリストである場合、適切な場所が見つかるまでリストを1つずつトラバースする必要があるため、これはかなり悪い選択です。アイテムを挿入します。つまり、O(N)です。これはリストが小さい場合は問題ありませんが、大きなグラフでは手に負えなくなる可能性があります。

通常、そのようなものに必要なのはヒープです。

http://en.wikipedia.org/wiki/Heap_%28data_structure%29

... O(log(n))で挿入およびポップできる場所...通常、ほとんどのプログラミング言語でそのまま使用できます。

6
dagnelies