質問

私は現在、基数ツリー/パトリシア トライ (呼びたいものは何でも) を実装しています。非常に能力の低いハードウェア上の辞書での接頭辞検索に使用したいと考えています。多かれ少なかれオートコンプリートのように機能するはずです。e.入力された接頭辞が一致する単語のリストを表示します。

私の実装はベースになっています この記事について, 、ただし、そのコードには接頭辞検索は含まれていませんが、著者は次のように述べています。

[...] 共通のプレフィックス「AB」を持つキーを持つすべてのノードを列挙したいとします。そのルートから開始して深さ優先検索を実行し、バックエッジに遭遇するたびに停止することができます。

しかし、それがどのように機能するのかわかりません。たとえば、次の単語から基数ツリーを構築するとします。

病気
想像上の
想像
想像する
模倣
すぐに
すぐに
計り知れない

接頭辞「i」と「in」についてはまったく同じ「最適一致」が得られるため、その最適一致からツリーをたどるだけで、一致するすべての単語を収集するのは難しいように思えます。

さらに、 Java での基数ツリーの実装 プレフィックス検索が実装されている RadixTreeImpl.java. 。このコードは、(特定のノードから始まる) すべてのノードのプレフィックス一致を明示的にチェックします。実際にはバイトを比較します。

誰かが基数ツリーでの接頭辞検索の実装に関する詳細な説明を教えてもらえますか?Java 実装で使用されるアルゴリズムがそれを行う唯一の方法ですか?

役に立ちましたか?

解決

静かにしてくtrieを符号化.各ノードのパスと共生していることでそのノードでのおとえば、開始Λ(資本金ラムダ、ギリシャのフォントのような吸い込みのルートノードに対応した空の文字列になります。Λは子どものための各文字の使用、データセットは、まったこの店は、"i"です。

  • Λ
  • Λ→"i"

の"i"のノードが子どもとのつながりのための"m"及び"n"次の文字は"n"ですが、

  • Λ→"い"→"n"

ての単語から始まる"i"、"n"のデータセット ""では、子どもから"n"ことになる。

現在、そうすることでデータセットになり"にした"infindibulum".(SFんのを参考に残しています。) いまだに"n"ノードで同じように、その場合は、次の書きは、"q"のマークだという言葉をご存知が表示されていないデータのセットである"q"です。その時点だと---"大丈夫ない。" (もしかしたらその後の追加にもなります。)

ただし、次の文字は"f"ができています。きもの短絡をするちょっとクラフトも一度に達するノードを表す独自のパスきは、 全体の文字列 オフノードです。だがこのノードしているのをご存知の残りの文字列 必要 する"findibulum"もんだの接頭辞に合わせて全体の文字列を返します。

どのように使用。多くのUNIXコマンド通訳者のように、古いVAX DCL、使用し独自の接頭辞のコマンドです。なので、相当の ls(1)DIRECTORY, がその他のコマンドで始まりDIRでき型 DIR ったとしても良いの言葉です。ませんでしたが、少し足を延ばせばを覚えて、正しいコマンドがいかにも"D"は、たいと思い)ESC;のDCL CLIを返す すべての のコマンドに始まる D, でも検索非常に早い。

他のヒント

これは、libのパトリシアトライの実装が含まれ、C ++標準のためのGNU拡張が判明します。これは、ポリシーベースのデータ構造の拡張の下で見つかりました。 http://gcc.gnu.org/onlinedocs/libstdc++/extを参照してください。 /pb_ds/trie_based_containers.htmlする

代替アルゴリズム:!それは簡単な愚かください。

ちょうどあなたのキーワードのソートされたリストを作ります。あなたは接頭辞を持っている場合は、そのプレフィックスがリストに配置されることになる場合には、バイナリ検索を検索します。あなたの補完はすべての場所にアクセスする準備ができて、そのインデックスを開始位置として検出されます。

このアルゴリズムは、パトリシアトライのコードのわずか5%が必要になりますし、維持しやすいだろう、理解、および更新。この単純なリストの検索が同様に、より効率的になりますほぼ確実である。

唯一の欠点は、あなたが同様のプレフィックスとの長いキーワードの膨大な数を持っている場合、それはすべてのエントリの完全なプレフィックスを維持する必要がないので、トライは、いくつかのストレージを節約することができます。あなたは数百万の言葉よりも少ないを持っている場合は、ツリーのポインタのオーバーヘッドが支配するので、実際には、これは貯蓄ではありません。この節約は、文字の数百万人でDNA文字列のデータベースを検索するようなアプリケーションのためのより多くのではなく、テキストのキーワードます。

別の代替アルゴリズムは、 三分探索木 (メモリ効率が向上) https://github.com/varunpant/TernaryTree/tree/master/TernaryTree

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top