テキストファイル内の文字列を見つける最も速い方法は何ですか?ケースシナリオ:約50000のファイルパスがリストされたテキストファイル内の特定のパスを検索します(各パスには独自の行があります)。テキストファイルの部分文字列を見つける最も速い方法
0
A
答えて
2
このサイズのファイルはメモリに簡単に収まらなければならず、アイテムとしてパスを使ってstd :: set(またはそれを手に入れたライブラリがあればさらに良いハッシュセット)にすることができます。正確なパスがあるかどうかを確認すると、非常に高速になります。
サブパスも検索する必要がある場合は、ソートされたstd :: vector(接頭辞のみを探している場合)が唯一便利な方法かもしれません。完全に一般的な部分文字列とにかくすべてのベクトルをスキャンする必要がありますが、それをしなければならない限り、何百倍もの悪影響はありません。
0
これは正規表現のフィールドです。あなたはgrepとawkを調べるべきです。
2
ファイル内で文字列を1回、複数のファイルで同じ文字列を繰り返し、同じファイル内に複数の文字列を見つける必要はありますか?
シナリオによっては、いくつかの可能な回答があります。あなたはBoyer-Mooreのようなアルゴリズムを使用して同じファイルに
をいくつかの文字列を検索する必要がある場合(アレックスによって提案されたセットのような)データstuctureを構築
は便利です、あなたが検索している場合は効率的です1つの文字列
複数の文字列を検索する必要がある場合は、正規表現エンジンを使用することをお勧めします。
0
検索を使用したい範囲はわかりませんが、FSMは使用するのに適したオプションです。ここで
は議論です:Short example of regular expression converted to a state machine?
関連する問題
- 1. 文字列の部分文字列を見つける方法
- 2. Pythonでテキストファイル内の部分文字列を見つける
- 3. 文字列中で最も長い連続した部分文字列を見つける方法は?
- 4. Mongodbのフィールドに部分文字列を見つける方法
- 5. アルファベット順に最長の部分文字列を見つける
- 6. 文字列の部分文字列を見つける
- 7. 既存の文字列のすべての部分文字列を決定する最も速い方法
- 8. テキストファイルで最も関連性の高い文字列を見つけるには?
- 9. 文字列pythonで最も長い一意の部分文字列を見つけよう
- 10. PHP配列内の文字列を見つける最も良い方法は?
- 11. 接尾辞ツリー(バイナリ文字列):最も長い部分文字列を見つけよう
- 12. UILabel内部の部分文字列のフレームを迅速に見つける方法は?
- 13. 文字列の一部を見つけて、文字列のその部分を結合する方法は?
- 14. 最長のパリンドローム部分文字列を見つける(サブシーケンスではない)
- 15. コントロールコレクション内のテキストマッチングコントロールを見つける最も速い方法
- 16. 部分文字列Bの最初のインスタンスの前に、部分文字列Aの最後のインスタンスを見つける方法はありますか?
- 17. 大文字の文字列の最初の一致インデックスを見つける最速の方法
- 18. 2つの大きなcsvファイル(Python)で文字列の部分文字列を見つける方法
- 19. 文字列の部分文字列の範囲を見つける
- 20. 可能なすべての部分文字列を見つける方法
- 21. 文字列に最も近いpalindromeを見つける
- 22. 部分文字列に一致する最初の値を見つける
- 23. Pythonは文字列内の部分文字列を見つける
- 24. JS文字列内の部分文字列IndexOf()を見つける
- 25. 最大のパリンドローム部分文字列を見つけるアルゴリズムの複雑さ
- 26. iOSで@ symbolを含む部分文字列を見つける方法
- 27. 文字列の最後の文字列を見つける方法
- 28. UILabelで部分文字列の座標を見つける
- 29. Java正規表現の部分文字列を見つける
- 30. C++は部分文字列の空白を見つける
私はこれが最速の方法であることを疑う - 最も簡単な。特定のパスが検索された場合、最速の方法は、各行を読み取って検索されたパスと比較し、一致が見つかるとすぐに中止することです。他のすべてはオーバーヘッドです。それ以外にstd :: hash_setは通常std :: setよりはるかに高速です。 –
あなたがライブラリを手元に持っているなら、私はハッシュセットをお勧めしました。ライブラリが使用する標準違反の 'std:'プレフィックスにもかかわらず、C++標準ではないことを忘れないでください。 1つのgulpで数百KBのディスクを読むことは、I/OとCPUの作業をミックスするより経験的に高速です(FS、ディスクキャッシュ、先読みなどのマルチタスクシステムでは少なくともディスクI/Oのコストリニア読み取り(100KB <1msec)よりもはるかにシークが多く、コンテキストの切り替えが可能になり、シークが発生しやすくなります(他のプロセスはディスクのどこかで見えるため)。 –
私は時間がかかり、ベンチマークサンプルを書いた。あなたは間違っています:80000行の5MBファイルを読み込むには、読み込んだ行ごとにstrcmpを含む良いマシンで約0.60秒かかります。 strcmpを省略してstd :: setをビルドすると、ランタイムは0.75秒に増えます。 –