155

したがって、ハッシュテーブルまたはプレフィックスツリーのどちらかを選択する必要がある場合、どちらかを選択するように導く識別要因は何ですか. 私自身の素朴な観点からは、トライを使用すると、配列として保存されないため、余分なオーバーヘッドがあるように見えますが、実行時間の観点からは(最長のキーが最長の英単語であると仮定して)、本質的に O になる可能性があります(1) (上限に関して)。たぶん、最も長い英単語は50文字ですか?

ハッシュ テーブルは、インデックスを取得するとすぐに検索されます。ただし、インデックスを取得するためにキーをハッシュすると、50 近くの手順を簡単に実行できるように思えます。

誰かがこれについてより経験豊富な視点を提供できますか? ありがとう!

4

8 に答える 8

134

試行の利点:

基礎:

  • 予測可能な O(k) ルックアップ時間 (k はキーのサイズ)
  • そこにない場合、ルックアップにかかる時間はk時間未満です
  • 順序付けされたトラバーサルをサポート
  • ハッシュ関数は不要
  • 削除は簡単です

新しい操作:

  • キーのプレフィックスをすばやく検索したり、特定のプレフィックスを持つすべてのエントリを列挙したりできます。

リンク構造の利点:

  • 共通のプレフィックスが多数ある場合、それらが必要とするスペースは共有されます。
  • 不変の試行は構造を共有できます。トライをその場で更新する代わりに、1 つの分岐に沿ってのみ異なる新しいトライを構築し、別の場所では古いトライを指すことができます。これは、並行性、テーブルの複数の同時バージョンなどに役立ちます。
  • 不変のトライは圧縮可能です。つまり、ハッシュコンシングによってサフィックスの構造も共有できます。

ハッシュテーブルの利点:

  • 誰もがハッシュテーブルを知っていますよね? あなたのシステムは、ほとんどの目的で試行するよりも速く、適切に最適化された優れた実装を既に持っています。
  • キーに特別な構造を持たせる必要はありません。
  • 明らかなリンクされたトライ構造よりもスペース効率が高い (以下のコメントを参照)
于 2008-10-29T06:38:06.697 に答える
50

それはすべて、解決しようとしている問題によって異なります。挿入と検索だけが必要な場合は、ハッシュ テーブルを使用します。接頭辞関連のクエリなど、より複雑な問題を解決する必要がある場合は、トライの方が適している可能性があります。

于 2008-10-29T05:25:20.137 に答える
14

ツリーを使用する:

  1. オートコンプリート機能が必要な場合
  2. 'a'または'axe'で始まるすべての単語を検索します。
  3. 接尾辞木は、木の特別な形です。接尾辞木には、ハッシュではカバーできない利点の全リストがあります。
于 2012-01-12T10:27:47.747 に答える
5

心に留めておくことが重要だと思うことを、誰も明示的に言及していないのを見たことがあります。通常、さまざまな種類のハッシュ テーブルと試行の両方にO(k)操作がありkます。

これは、適切なハッシュ関数があることを前提としています。「農場」と「農場の動物」を同じ値にハッシュしたくない場合、ハッシュ関数はキーのすべてのビットを使用する必要があるため、「農場の動物」のハッシュには約 2 倍の時間がかかります。 「ファーム」(何らかのローリング ハッシュ シナリオを使用している場合を除きますが、試行を伴う操作を節約する類似のシナリオもあります)。そして、バニラ トライでは、「農場の動物」を挿入すると、「農場」だけの場合の約 2 倍の時間がかかる理由は明らかです。長い目で見れば、圧縮された試行でも同様です。

于 2014-10-16T12:40:26.170 に答える
-2

一部の (通常は組み込みのリアルタイム) アプリケーションでは、処理時間がデータとは無関係である必要があります。その場合、ハッシュ テーブルは既知の実行時間を保証できますが、トライはデータに基づいて変化します。

于 2008-10-29T05:31:49.810 に答える