2009-08-17 20 views
1

小さなパーサを書いてBBCodeを解析し、適切にフォーマットされたHTMLを返すことに決めました。私はキーワードを表現する最も効率的な方法が何であるかを決めるのに苦労しています。私は常にそれらを保持するために別々の文字列を使用することができますが、私は効率的な検索を可能にするいくつかの未知のデータ構造(私にとって)がなければならないように感じる。キーワードを保持する最も効率的なデータ構造は何ですか?

STLに何かがある場合はC++を使用しています。私は実際にそれを使用するつもりはないので、PHPのようなものを使う必要はありません。 GUIインターフェイスはありません。テキストファイルを入力するだけで、HTMLを解析して新しいファイルを出力します。

編集:キーワードでは、開幕タグと終了タグを意味します([b][/b]など)。

答えて

4

事前にすべてのキーワードを知っているので、perfect hashingを利用することができます。 this library経由 - ウィキペディアentryとそのポインタを参照してください。

1

古典は、1973年の論文で紹介されたAho-Corasickキーワードツリーです。

線形時間単語挿入、線形時間単語参照。

+0

コンパイル時に挿入されるので、これはリニアルックアップを持つ生の配列を使用するよりもなぜ優れていますか? – jkeys

+0

?なぜコンパイル時に挿入が行われるのですか?あなたの挿入はコンパイル時にのみ行われることを意味しますか? さらに、配列がリニアタイム検索であるかどうかはわかりませんが、サフィックス配列に基づいた高度なアルゴリズムを使用していない限り、私はあなたが疑うところです。 aho-corasickメソッドは、検索している単語の長さに対して時間的に一致するすべてのキーワードを検索します。 –

2

古典的な答えはハッシュテーブルです。一定時間の挿入/置換。

しかし、あなたが望むものは完全にはっきりしていません。単純な配列があなたのコードを覗いているのではなく、きちんと整理されたキーワードを保つのであれば、 #definesを使用して索引付けして選択します。

+0

私はそれを簡単に保ちたいです。スピードが心配なら(すなわち、私は線形時間の代わりに一定時間が必要です)、私の唯一の選択肢は、個々の文字列を格納し、それらを別々に使用することですか? – jkeys

+0

このアプローチを使用する場合、Karp-Rabinが答えです。真の一定の時間を達成することはできません。 –

関連する問題