web-dev-qa-db-ja.com

バイナリヒープとフィボナッチヒープの実際のアプリケーション

フィボナッチヒープとバイナリヒープの実際のアプリケーションは何ですか?問題を解決するためにそれを使用したときに、いくつかのインスタンスを共有できれば素晴らしいと思います。

編集:バイナリヒープも追加されました。知りたい。

32
devnull

実生活ではめったに使用しません。フィボナッチヒープの目的は、ダイクストラのアルゴリズムの漸近的な実行時間を改善することだったと思います。非常に大きな入力を改善できる可能性がありますが、ほとんどの場合、必要なのは単純なバイナリヒープだけです。

ウィキから:

空の構造で始まる一連の操作の合計実行時間は上記の範囲によって制限されますが、シーケンス内の一部の(ごくわずかな)操作は完了するまでに非常に長い時間がかかる場合があります(特に、削除と最小削除の実行時間は線形です。最悪の場合)。このため、フィボナッチヒープやその他の償却データ構造は、リアルタイムシステムには適さない場合があります。

バイナリヒープは、値のセットから最大(または最小)値をすばやく見つけるために使用できるデータ構造です。これは、ダイクストラのアルゴリズム(最短パス)、プリムのアルゴリズム(最小スパニングツリー)、およびハフマン符号化(データ圧縮)で使用されます。

17
Peter Alexander

フィボナッチヒープについては言えませんが、優先キューではバイナリヒープが使用されます。優先キューは、実際のシステムで広く使用されています。

既知の例の1つは、カーネル内のプロセススケジューリングです。最も優先度の高いプロセスが最初に実行されます。

セットのパーティション化で優先度付きキューを使用しました。最大メンバーを持つセットが最初にパーティショニングに使用されました。

12
Manoj R

ほとんどのシナリオでは、次の複雑さに基づいて選択する必要があります。

  • 挿入
  • 要素を見つける

そして、通常の容疑者は次のとおりです。

  • BST:log(n)挿入して検索
  • リンクリスト:O(1)insertおよびO(n) find
  • ヒープ:
    • O(1) insert
      • バイナリヒープの平均。以下を参照してください: https://stackoverflow.com/a/29548834/895245
      • フィボナッチで償却。これは平均よりも強く、最悪の場合よりも弱いです。
    • O(1) find最初の要素のみO(n)一般
      • バイナリヒープの最悪のケース
      • フィボナッチで償却

Brodal queue や、最悪の場合O(1)に達する他のヒープもありますが、それに値するためには、Fibonacciよりも さらに大きなキュー が必要です。

したがって、アルゴリズムが最初の要素を「検索」して大量の挿入を行うだけでよい場合は、ヒープが適しています。

他の人が述べたように、これはダイクストラの場合です。

優先度付きキューは通常、ヒープとして実装されます。例: http://download.Oracle.com/javase/6/docs/api/Java/util/PriorityQueue.html

巨大なデータセットから上位N個の要素を計算するには、バイナリヒープを使用して効率的に実行できます(大規模なWebサイトでの上位の検索クエリなど)。

0