web-dev-qa-db-ja.com

最高のオートコンプリート/提案アルゴリズム、データ構造[C ++ / C]

Google、FirefoxのいくつかのAJAXページには、ユーザーが文字を入力している間、可能性のあるアイテムのリストが表示されます。

誰かが良いアルゴリズム、オートコンプリートを実装するためのデータ構造を提供できますか?

48
subbul

トライ は、プレフィックスに一致する単語をすばやく見つけるために使用できるデータ構造です。

編集:これを使用してオートコンプリートを実装する方法を示す例を示します http://rmandvikar.blogspot.com/2008/10/trie-examples.html

3つの異なる オートコンプリートの実装 の比較です(ただし、Javaです)。

* In-Memory Trie
* In-Memory Relational Database
* Java Set

キーを検索するとき、トライはSet実装よりもわずかに高速です。トライとセットの両方は、リレーショナルデータベースソリューションよりもかなり高速です。

セットのセットアップコストは、TrieまたはDBソリューションよりも低くなっています。新しい「ワードセット」を頻繁に作成するのか、検索速度を優先するのかを決める必要があります。

これらの結果はJavaのものであり、C++ソリューションによって燃費は異なる場合があります。

58
Glen

大規模なデータセットの場合、バックエンドの適切な候補はTernary検索ツリーです。バイナリ検索ツリーのスペースオーバーヘッドが低いことと、デジタル検索試行の文字ベースの時間効率という2つの世界の長所を組み合わせています。

Dr. Dobbs Journalを参照してください: http://www.ddj.com/windows/184410528

目標は、ユーザーが入力するときに有限の結果セットを高速で取得することです。まず、「コンピューターサイエンス」を検索するには、「コンピューター」または「サイエンス」から入力できますが、「コンピューター」からは入力できないことを考えてみましょう。そのため、フレーズを指定して、Wordで始まるサブフレーズを生成します。次に、各フレーズについて、それらをTST(三次検索ツリー)にフィードします。 TSTの各ノードは、これまでに入力されたフレーズのプレフィックスを表します。そのノードにそのプレフィックスのベスト10(たとえば)結果を保存します。ノードの結果の数が有限(ここでは10)よりも多くの候補がある場合、2つの結果間の競合を解決するためのランキング関数が必要です。

ツリーは、データのダイナミズムに応じて、数時間ごとに1回構築できます。データがリアルタイムである場合、他のアルゴリズムがより良いバランスを与えると思います。この場合、絶対的な要件は、入力したすべてのキーストロークの結果を非常に高速に取得することです。

スペルの修正の提案が含まれる場合、さらに複雑になります。その場合、編集距離アルゴリズムも同様に考慮する必要があります。

国のリストのような小さなデータセットの場合、Trieの簡単な実装で十分です。このようなオートコンプリートドロップダウンをWebアプリケーションに実装する場合、YUI3のオートコンプリートウィジェットは、リストにデータを提供した後にすべてを行います。 YUI3を大きなデータに裏付けられたオートコンプリートのフロントエンドとしてのみ使用する場合、C++でTSTベースのWebサービスを作成し、オートコンプリートウィジェットのスクリプトノードデータソースを使用して、単純なリストの代わりにWebサービスからデータを取得します。

19
Joy Dutta

セグメントツリー は効率的に実装するために使用できます オートコンプリート

6
r15habh

最も人気のある補完候補を提案する場合は、「提案ツリー」を選択するのが適切です。 提案ツリー

4
Nicolai

簡単な解決策:最小編集( Levenshtein )距離(1または2)で「候補」を生成し、ハッシュコンテナー(setは単純なソルションに十分であるため、tr1またはboostからunordered_setを使用します)。

例:carrを作成し、carが必要です。 arrは1つの削除によって生成されます。あなたのunordered_setにarrがありますか?いいえ。crrは1つの削除によって生成されます。 crrはunordered_setにありますか?いいえ。車は1つの削除によって生成されます。車はunordered_setにありますか?はい、あなたは勝ちます。

もちろん、挿入、削除、転置などがあります...

特にunordered_setが非常に少ない場合、候補を生成するためのアルゴリズムが本当に時間を無駄にしていることがわかります。

2
anno