2011-12-27 9 views
15

私は最近自分のプログラムの1つにツリーを使用する必要がありました。私はバイナリツリーを自分で構築しなければならなかったのですが、なぜCollections APIにデフォルトツリー(またはバイナリツリー)の実装?なぜJava Collections APIにTreeが実装されていないのですか

コレクションAPIに含めないと決めた理由があると思います。

+0

実際には、興味深い – Eugene

+4

TreeSetとTreeMapは、バイナリツリーによってバックアップされる2つのコレクションです。 –

+0

私はバイナリツリーだけを話していません。一般的なツリーインプリメンテーション、ツリーインテグフェイスはありませんか? –

答えて

0

java.util.TreeMapは、赤と黒のツリーの実装です。

+0

私はTreeMapが存在することを知っていますが、より具体的なツリーデータ構造の形をしています。私たちがリストと集合のために持っているのと同じです。コレクションAPIの作成者がツリーの一般化された形式を与えないことにした理由彼らはinteface Tree とその実装をBinaryTree、AVLTree、RedBlackTreeとして与えることができましたか? –

+0

私はArtem Zh。の答えに同意します。ツリーは、エンティティの「コレクション」を保持するためのデータ構造の特定の形式です。 – Scorpion

10

IMHO、理論的には、Treeはコレクションの一種ではなく、単なる実装の種類です。私は抽象的なコレクション(配列の順序付けられていないセット)、リスト(順序付けされたエントリセット)、マップ(それらの間の関係を持つエントリの2つのセット)などがあり、それらの実装があることを意味します:array、list )、HashSetなど、それらのすべてには長所と短所があります。したがって、ツリーは、配列よりも(おおよそ)高速な検索を提供するインデックスからのアクセスはありませんが、リストの実装の1つに過ぎません。

ところで、JavaのTreeMap(「Red-BlackツリーベースのNavigableMap実装」)とTreeSet(「TreeMapに基づくNavigableSet実装」)クラスがあります。

+0

これ。コレクションはデータ構造によって定義されているのではなく、挿入、削除、および参照に関するパフォーマンスに関する約束です。実装の詳細は無関係であると想定され、使用要件が何であるかに基づいてコンテナを選択します。たとえば、要素が常にソートされ、ルックアップがO(log n)になるようなコンテナが必要な場合は、SetまたはSortedMapが必要です。実装がパフォーマンス保証をどのように満たすかは重要ではありません。 –

+1

私は同意しません。コレクションは契約によって定義されます。 'Set'は順序の保証をしません(したがって、インデックスに登録されていない)が、重複を保証しません。 'List'は順序を保証しますが、重複は許可します。 'Map'には要素間の関係が含まれます。ツリーのいくつか(すべて?)を実装するためにツリーを使用できるという事実は無関係です。たとえば、 'Set'を実装するために' List'を使うことができます(例えば 'LinkedHashSet')。ツリーを実装する方法は複数あります。 – Tonio

15

コレクションAPIに含めないと決めた理由があると思います。私は便利な理由は誰もが、ユースケースの広い範囲をカバーするのに十分な汎用の両方

  • ある木のために良いAPIを打ち出していないことだと思い、そして

一般的なパフォーマンスのオーバーヘッドを補うのに十分です。

(そして、どこで?ツリーを停止していますか?バイナリツリー?N分木?DAG?グラフ?)

Apache CommonsのコレクションやGoogleコレクション(通称グアバ)のいずれもが持っていることは注目に値しますツリーAPI。しかし、このトピックにはアクティブなGuavaの問題があります - http://code.google.com/p/guava-libraries/issues/detail?id=174 - 少なくとも明らかに少なくとも人はあなたの視点に同意します。バージョン15.0のよう

UPDATE

、グアバは今TreeTraverserBinaryTreeTraverserクラスの形式でツリーをサポートしています。しかし、これはあなたが期待するものではないかもしれません。実際には、これらのクラスはツリーデータ構造を実際に実装していません。代わりに、ジェネリック型のパラメータでこれを行う必要があります。さらに、Traverserクラスでは、ノード型のAPIについての前提を避けることさえできます。彼らは、抽象クラスであり、具体的なtraverserサブタイプにツリーを問い合わせる操作を実装することを要求することによってこれを行います。例えばノードの子を取得します。


FWIW、TreeMapTreeSetは "木のAPI" ではありません。それらは、MapおよびSet APIのツリーベースの実装です。このツリーツーはパブリックAPIによって完全に隠されているため、これらの2つのクラスは汎用ツリーとして完全には使用できません。

関連する問題