2009-08-07 26 views

答えて

2

このサイズのファイルはメモリに簡単に収まらなければならず、アイテムとしてパスを使ってstd :: set(またはそれを手に入れたライブラリがあればさらに良いハッシュセット)にすることができます。正確なパスがあるかどうかを確認すると、非常に高速になります。

サブパスも検索する必要がある場合は、ソートされたstd :: vector(接頭辞のみを探している場合)が唯一便利な方法かもしれません。完全に一般的な部分文字列とにかくすべてのベクトルをスキャンする必要がありますが、それをしなければならない限り、何百倍もの悪影響はありません。

+0

私はこれが最速の方法であることを疑う - 最も簡単な。特定のパスが検索された場合、最速の方法は、各行を読み取って検索されたパスと比較し、一致が見つかるとすぐに中止することです。他のすべてはオーバーヘッドです。それ以外にstd :: hash_setは通常std :: setよりはるかに高速です。 –

+0

あなたがライブラリを手元に持っているなら、私はハッシュセットをお勧めしました。ライブラリが使用する標準違反の 'std:'プレフィックスにもかかわらず、C++標準ではないことを忘れないでください。 1つのgulpで数百KBのディスクを読むことは、I/OとCPUの作業をミックスするより経験的に高速です(FS、ディスクキャッシュ、先読みなどのマルチタスクシステムでは少なくともディスクI/Oのコストリニア読み取り(100KB <1msec)よりもはるかにシークが多く、コンテキストの切り替えが可能になり、シークが発生しやすくなります(他のプロセスはディスクのどこかで見えるため)。 –

+0

私は時間がかかり、ベンチマークサンプルを書いた。あなたは間違っています:80000行の5MBファイルを読み込むには、読み込んだ行ごとにstrcmpを含む良いマシンで約0.60秒かかります。 strcmpを省略してstd :: setをビルドすると、ランタイムは0.75秒に増えます。 –

0

これは正規表現のフィールドです。あなたはgrepとawkを調べるべきです。

2

ファイル内で文字列を1回、複数のファイルで同じ文字列を繰り返し、同じファイル内に複数の文字列を見つける必要はありますか?

シナリオによっては、いくつかの可能な回答があります。あなたはBoyer-Mooreのようなアルゴリズムを使用して同じファイルに

  • をいくつかの文字列を検索する必要がある場合(アレックスによって提案されたセットのような)データstuctureを構築

    • は便利です、あなたが検索している場合は効率的です1つの文字列

    • 複数の文字列を検索する必要がある場合は、正規表現エンジンを使用することをお勧めします。

  • 関連する問題