web-dev-qa-db-ja.com

指定された文字列配列で部分文字列を検索します

N個の文字列の配列があります。指定された文字列で始まる配列のすべての要素を選択したいと思います。

それが明確でない場合は申し訳ありません。例を挙げましょう。

input = "as"
array = ["abas", "aras", "as", "ask", "asi", "aso", "atas" ]
output =            ["as", "ask", "asi", "aso"]

この選択を行うには、どのアルゴリズムが必要ですか。 JavaScriptのオートコンプリートに使用しているため、この操作を実行する最速のアルゴリズムが必要です。したがって、検索はユーザーの入力速度よりも高速である必要があります。

編集:データ構造を使用する場合、前処理する必要のあるデータについて考えていました。データは動的であり、何度も挿入操作を実行する必要があります。 AJAXリクエストを使用して動的にデータをフェッチしています。

編集2:配列には100万のエントリが含まれている可能性があり、検索は2か所で行う必要があります。サーバー側に1つあり、条件に一致するすべての要素を選択します。これは10000エントリに制限でき、もう一方はクライアント側にあります...検索サイズはそれらの10000エントリになり、これは最初の250エントリに制限できます。

質問の編集が遅れてすみません。

1
Boopathi Rajaa

前処理ステップとして、リストを trie に変換します。

トライは、デジタルツリーまたはプレフィックスツリーとも呼ばれ、キーが通常文字列である動的セットまたは連想配列を格納するために使用される順序付きツリーデータ構造です。二分探索木とは異なり、ツリー内のどのノードもそのノードに関連付けられたキーを格納しません。代わりに、ツリー内のその位置によって、関連付けられているキーが定義されます。ノードのすべての子孫には、そのノードに関連付けられた文字列の共通のプレフィックスがあり、ルートは空の文字列に関連付けられています。値は通常、すべてのノードに関連付けられているわけではなく、対象のキーに対応するリーフといくつかの内部ノードにのみ関連付けられています。

トライという用語は、re-trie-val ..から来ています。

http://upload.wikimedia.org/wikipedia/commons/thumb/b/be/Trie_example.svg/250px-Trie_example.svg.png

5
Peter Taylor

すでに存在するオートコンプリートアルゴリズムの1つを使用することをお勧めしますが、独自のアルゴリズムを作成する場合は、トライが理想的なデータ構造です。挿入と検索はどちらも一定時間、つまりO(1)で実行されるため、速度は問題になりません。

また、これはあなたが望むものに似ているようです: http://webscripts.softpedia.com/script/Forms-and-Controls-C-C/Auto-Complete-Textfield-21580.html

1
BlackJack

検索したい単語のセットの大きさはどれくらいですか?

小さなセットの場合は、配列を並べ替えてから、変更されたバイナリ検索を実行して、最初と最後に一致する要素を見つけるのが最適な場合があります。

より大きなセットの場合は、アレイを完全に破棄して、トライを行うことをお勧めします。

編集:
100万語(本当に100万語?]を期待していると更新した場合、オックスフォード英語辞典には 171,476語しかありません)次に、Trieが最善の策です。ただし、独自の実装を展開する前に、無料で入手できるオートコンプリートツールのいくつかを真剣に検討したいと思います。

0
Qwerky