web-dev-qa-db-ja.com

フィボナッチヒープの標準のJava実装はありますか?

さまざまな種類のヒープデータ構造を見ていました。

フィボナッチヒープは、(1)挿入、(2)削除、および(2)最小要素の検索に関して、最悪の場合の複雑度が高いようです。

Java=に、バランスの取れたバイナリヒープであるクラスPriorityQueueがあることを発見しましたが、なぜフィボナッチヒープを使用しなかったのですか?

また、Java.utilにフィボナッチヒープの実装はありますか?

ありがとう!

32
Phil

いいえ、標準のJavaコレクションAPIにはフィボナッチヒープの実装が含まれていません。なぜそうなのかはわかりませんが、フィボナッチヒープは償却後の漸近的に優れているためです。コレクションフレームワークには、2項式のヒープも含まれていないため、これを含めることもできます。

完全に恥知らずな自己プラグインとして、私は Java)にフィボナッチヒープの実装 を持っています。それがどれほど役立つかはわかりませんが、しかし、それがどのように機能するかを知りたい場合は、それが良い出発点になると思います。

お役に立てれば!

46
templatetypedef

しかし、なぜフィボナッチヒープを使用しなかったのでしょうか。

おそらく、これらのヒープには、バイナリキーよりもエントリごとのオーバーヘッドが多いためです。

また、Java.utilにフィボナッチヒープの実装はありますか?

いいえ、でも

  1. graphmaker がNathan Fiedlerから-GPLと良い testカバレッジ がありますが、 こちらの素敵なブログ投稿をご覧ください それについて、そしてフィボナッチインプリが持つことができる問題について。この投稿では、他の多くのJava実装が参照されています。
  2. 単体テストのコードがあります here
  3. JGraphTプロジェクト (同じくNathan Fiedler)および(一部のマイナー) tests を使用しますが、LGPLです。
  4. 最後に重要なことですが Neo4j -GPL-テストはありません。
5
Karussell

しかし、なぜフィボナッチヒープを使用しなかったのでしょうか。

主な理由は、フィボナッチヒープが役立つのは、1つのextractMin操作に接続された多くの減少キー操作がある場合に限られるためです。たとえば、ダイクストラのアルゴリズムで使用している場合です。

また、Java.utilにフィボナッチヒープの実装はありますか?

Java.utilには実装がありませんが、フィボナッチヒープの既存のオープンソースバージョンを使用して、このトピックについていくつかの実験を行いました。あなたはそれを 私のブログで または プロジェクトのGitHubリポジトリ で見つけることができます。

1
gabormakrai