web-dev-qa-db-ja.com

優れた安定したC ++ツリー実装とは何ですか?

誰かが良いC++ツリーの実装、できればstlと互換性のあるものを推奨できるかどうか疑問に思っています。

記録のために、私はこれまで何度もツリーアルゴリズムを書いてきました。そして、それが楽しくなることは知っていますが、可能な限り実用的で怠zyになりたいです。したがって、実際のソリューションへの実際のリンクがここの目標です。

注:バランスの取れたツリーやマップ/セットではなく、一般的なツリーを探しています。この場合、構造自体とツリーの接続性が重要です。内部のデータだけではありません。したがって、各ブランチは任意の量のデータを保持できる必要があり、各ブランチは個別に反復可能である必要があります。

41
Robert Gould

私はあなたの要件については知りませんが、あなたが主に構造に興味があり、ツリーにあまり興味がないなら、グラフ(例えば、 Boost Graph での実装)で良くなることはないでしょうか-バランスをとる速度のような特定の利点?グラフを介してツリーを「エミュレート」できます。おそらく、(概念的に)探しているものに近くなります。

23
Roel

this を見てください。

C++のtree.hhライブラリは、ノードに格納されたデータをテンプレートにしたn項ツリー用のSTLのようなコンテナクラスを提供します。さまざまなタイプの反復子が提供されます(ポストオーダー、プレオーダー、その他)。可能な場合、アクセス方法はSTLと互換性があるか、代替アルゴリズムが利用可能です。

HTH

19
MvdD

ツリーの代わりにstd :: mapを使用することをお勧めします。

ツリーの複雑さの特性は次のとおりです。

挿入:O(ln(n))
削除:O(ln(n))
検索:O(ln(n))

これらは、std :: mapが保証するのと同じ特性です。
その結果、std :: mapのほとんどの実装では、カバーの下にツリー(赤黒ツリー)が使用されます(技術的には必須ではありません)。

7
Martin York

わかりました、別のツリーライブラリを見つけました。 stlplus.ntree 。しかし、まだ試していない。

3
Robert Gould

(キー、値)ペアがなく、単にキーがある場合は、std :: setを使用します。これは、std :: mapと同じ赤黒ツリーを使用します。

2
Denes Tarjan