web-dev-qa-db-ja.com

Pythonの組み込みバイナリ検索ツリー?

自己バランス二分探索木RED-BLACK[〜#〜] avl [〜#〜]またはその他)Python 2.7またはPython 3.xの組み込み型?

Javaの TreeMap または TreeSet に相当するものを探しています。

そのような組み込みがない場合、なぜ省略されたのですか?そのようなツールを含めないのに特別な理由はありますか?

20

私の知る限り、特別な理由はありません。理由は、非常に多くのアプリケーションで、高度に調整されたdictおよびsetの実装(ハッシュテーブル)が適切に機能するためだと思います。ほとんどの場合、これで十分です。バランスのとれたバイナリ検索ツリーのパフォーマンス特性(追加順ではなくキーに基づく順序付けられたトラバーサルなど)が必要な状況は確かにありますが、これらは、人々がサードパーティのパッケージを入手することに満足している、打たれた道から十分離れていますその場合。

PyPIで bintrees パッケージを使用して良い経験をしました。これは、純粋なPythonおよび Cython で記述された拡張として)の両方で、不均衡なAVLおよび赤黒のバイナリツリーの実装を持っています。

残りの理由は本質的には歴史的な事故だと思います。 bintreesを作成した人がstdlibに含めるように働きかけ、メンテナンスとリリースに課せられる制約に我慢して進んでいれば、おそらくそうなるでしょう(Cythonの依存関係が問題を引き起こすでしょうが、 。)

アルゴリズムの複雑さ:

ハッシュテーブル(dictやセットなど)の場合、挿入と検索はO(1)ですが、バランスの取れたツリーの場合、これらはO(log(n))です。キーの順序トラバーサルは、ツリーではO(n)ですが、ハッシュテーブルで同じことを行うには、まずキーをソートする必要があるため、O(n * log( n))使用するデータ構造の種類を選択するときは、使用する操作を検討し、アプリケーションで最も意味のあるトレードオフを選択する必要があります。

18
babbageclunk

標準ライブラリではツリーは見つかりません。 Python内部でハッシュテーブルである辞書を多用しています(オブジェクト、クラス、モジュールはすべてdictsに基づいています)。したがって、dictsは大幅に最適化されています。これにより、検索ツリーの必要性が大幅に小さくなります。また、そのようなツリーを効率的にするには、拡張タイプで実装します。

1
hivert