0

文字列処理のアルゴリズムを探しています。検索しましたが、要件を満たすアルゴリズムが見つかりませんでした。アルゴリズムが何をすべきかを例を挙げて説明します。

以下に示すように定義された単語セットの 2 つのセットがあります。

**Main_Words**: swimming, driving, playing
**Words_in_front**: I am, I enjoy, I love, I am going to go

プログラムは、 Main_Wordsで定義されている単語を見つけるとすぐに、単語の膨大なセットを検索し、その Word の前の単語をチェックして、 Words_in_front で定義された一致する単語があるかどうかを確認します

つまり、プログラムが "Swimming" という単語に遭遇した場合、"Swimming" という単語の前にある単語が次のいずれかであるかどうかをチェックする必要があります。

これを行うことができるアルゴリズムはありますか?

4

3 に答える 3

1

Map/dictionary/hash/associative array (あなたの言語で定義されているものは何でも) を作成します。キーはMain_Wordsにあり、Words_in_frontは、キーが指すエントリに関連付けられたリンク リストです。キーに一致する単語に出くわすたびに、表に移動して、前に示したものと一致する単語が添付のリストにあるかどうかを確認します。

これが基本的な考え方で、速度とスペースの両方を最適化できます。

于 2013-03-30T09:36:33.587 に答える
1

これを行う簡単な方法は、テキストを線形スキャンし、最後に表示された N+1 個の単語 (または文字) を常に追跡することです。ここで、N は最も長いフレーズの単語 (または文字) の数です。あなたのwords_in_frontコレクションに含まれています。「主要な単語」がある場合、N個の単語/文字のシーケンスが、使用している接頭辞で終わる前にあるかどうかを確認できます。

words_in_frontセットをハッシュマップ(おそらくフレーズの最後の文字でキー付けされている..)や何らかのプレフィックス/サフィックスツリーなどのより適切なデータ構造に変換すると、これは少し速くなります。一致.endsWithする「主要な単語」があるたびに、一連の接頭辞のすべてのメンバーを繰り返します。別の回答で述べたように、最適化の余地と他にいくつかの可能な実装の余地がありますが、開始点があります。

于 2013-03-30T15:27:52.473 に答える
1

次の行に沿って正規表現を作成できるはずです。

I (am|enjoy|love|am going to go) (swimming|driving|playing)
于 2013-03-30T10:33:12.667 に答える