大きなテキスト内の単語を検索するには、ボイヤームーアアルゴリズムが広く使用されています。
原則(実際の例についてはリンクを参照):ファイル内のある場所(インデックス)で比較を開始するときに、比較対象のテキストの最初の文字が検索対象の単語にまったく含まれていない場合、比較する必要はありません。他の[wordLength-1]文字とテキスト、およびインデックスは単語の長さの前に移動できます。文字が単語に含まれている場合、ここでは正確ではありませんが、数文字だけシフトされている場合は、比較も数文字だけシフトできます...
- 単語の長さとテキストとの類似性によっては、検索が大幅に高速化される場合があります(naiveSearchTime / wordLengthまで)。
編集ファイルの最後から検索するので、単語の最初の文字(最後ではない)が最初に比較されます。たとえば、「2001 a space odyssey」で「space」を検索すると、単語スペース「s」はオデッセイの最初の「y」と比較されます。次の比較は、テキストスペース「c」に対する同じ「s」です。
そして最後に、n番目のオカレンスを見つけるために、単語が見つかるたびに単純なカウンター( nに初期化)がデクリメントされ、0に達するとそれだけです。
アルゴリズムは理解しやすく、実装も簡単です。面接に最適です。
ファイルを1回だけ検索するのか、それとも数回検索するのかを尋ねることもできます。複数回検索する場合は、ファイルから単語にインデックスを付けることをお勧めします。つまり、単語が含まれているかどうか、どこに、何回かなどをすばやく見つけることができる構造をメモリ内に作成します...私はTrieアルゴリズムも理解しやすく、非常に高速であることが好きです(文章)。その複雑さはO(wordLength)です。
-
インタビュアーが「非常に大きなファイル」について言及する場合、考慮すべき多くの要因があります。
- 上記の検索アルゴリズム
- テキストはメモリに収まりますか?(たとえば、すべてを処理する場合)ファイルシークアルゴリズムを実装する必要がありますか(つまり、一度にメモリ内のファイルの一部のみを使用します)
- ファイルはどこにありますか?メモリ(高速)、ハードディスク(低速ですが、少なくともローカル)、リモート(通常は低速、接続の問題、リモートへのアクセス、ファイアウォール、ネットワーク速度など)
- ファイルは圧縮されていますか?(圧縮を解除すると、さらに多くのスペースが必要になります)
- ファイルは1つのファイルまたは複数のチャンクで構成されていますか?
- テキストまたはバイナリが含まれていますか?テキストの場合、その言語は文字が出現する可能性を示します(たとえば、英語ではYがフランス語よりもはるかに頻繁に出現します)。
- 必要に応じて、ファイルの単語にインデックスを付けることを提案します
- より簡単に処理できる小さなファイルを作成するために、大きなファイルからより単純なファイルを作成することを提案します(繰り返しの単語を削除するなど)。
..。