web-dev-qa-db-ja.com

トライとツリーの違いは?

試行はノードごとのデータ全体を保存するのではなく、親ノードへのサフィックスのみを保存することをリモートで覚えています。

ツリーはデータ全体を保存しますが、プレフィックスに基づいてのみ組織化します。

そのため、試行回数は小さくなり、たとえば、辞書を非常によく圧縮できます。

それが本当に唯一の違いですか?

実際のアプリケーションから、範囲クエリでは試行が速くなることを覚えています。範囲クエリを高速化する特別なsolr/luceneトライフィールドもあります。しかし、それはどうですか?

実際の違いは何ですか?試行とツリーの利点と欠点は何ですか?

54
The Surrican

ツリーは、再帰ノードの一般的な構造です。木の種類はたくさんあります。人気のあるものは 二分木バランスツリー です。 A Trie は一種のツリーで、接頭辞ツリー、デジタル検索ツリー、および検索ツリー(したがって「トライ」という名前)を含む多くの名前で知られています。

ツリーの種類ごとに、目的、構造、動作が異なります。たとえば、バイナリツリーには、比較可能なアイテム(たとえば、数値)のコレクションが格納されます。したがって、数値のセットを格納したり、数値で表すことができる他のデータ(たとえば、ハッシュ可能なオブジェクト)にインデックスを付けたりするために使用できます。その構造はソートされているため、すばやく検索して単一のアイテムを見つけることができます。バランスの取れたツリーなどの他のツリー構造は、原則として同じです。

トライ は、その構造内のシーケンスを表します。個別の単一の値ではなく、値のシーケンスを格納するという点で非常に異なります。再帰の各レベルは、「入力リストのアイテムIの値は何か」を示しています。これは、単一の検索値を各ノードと比較するバイナリツリーとは異なります。

60
Joe

バイナリツリーまたはbstは通常、数値を格納するために使用されます。 bstの時間の複雑さはO(log(n))で、挿入、削除、検索の場合、バイナリツリーの各ノードには最大で2つの子ノードがあります。

Trie:トライのすべてのノードは複数のブランチで構成されます。各ブランチは、キーの可能な文字を表します。すべてのキーの最後のノードをリーフノードとしてマークする必要があります。トライノードフィールド値は、ノードをリーフノードとして区別するために使用されます(値フィールドには他の用途があります)

試行について学ぶには、このトップコーダーのチュートリアルを参照してください。 https://www.topcoder.com/community/data-science/data-science-tutorials/using-tries/

4
Harsh Gupta

この講演 からいくつかの洞察を得ました。たとえLinuxカーネルで使用されているRadixツリーを通してでも、ウィキペディアのものとは少し異なります。

ツリーはキーのみを保存し、キーに関連付けられた値は保存しません。

2
firo