可能な重複見つける:
C++ string::find complexityパフォーマンスのstd :: STD対はstrstr ::文字列::
を最近、私は機能std::string::find
が遅く大きさの順であること、が分かりましたstd::strstr
より - 私の環境では、LinuxのGCC 4.7を使っている。パフォーマンスの違いは、文字列の長さとハードウェアアーキテクチャによって異なります。 は、基本的には、ループの中でを呼び出します(時間の複雑さはO(m * n)
です)。対照的に、std::strstr
はハードウェアアーキテクチャ(SSE命令など)に高度に最適化されており、より洗練された文字列マッチングアルゴリズム(明らかにKnuth-Morris-Pratt)を使用しています。
私はまた、言語文書(すなわちドラフトN3290とN1570)において、これら2つの機能の時間的複雑さを見出さないことに驚いた。私はchar_traits
の時間複雑さしか見つけませんでした。しかし、それは役に立ちません。char_traits
に部分文字列検索の機能がないためです。
私は、std::strstr
とmemmem
にはほぼ同じ性能の類似の最適化が含まれていると思います。そして、最近まで私はstd::string::find
がmemmem
を内部的に使用すると仮定しました。
質問は以下のとおりです。std::string::find
はstd::memmem
を使用しない理由は何か良い理由、ありますか?これは他の実装とは異なるのでしょうか?
質問はありません:この機能の最適な実装は何ですか? Cよりも遅い場合、C++について議論するのは本当に難しいです。両方の実装が遅いかどうかは関係ありません。それは本当に痛いパフォーマンスの違いです。
@FrerichRaabe:そうです、2つの質問に重複があります。しかし、私の質問はより具体的であり、他の記事は誰にも答えません。 – nosid
@nosid:そうです。特に、平均ケースと最悪ケースとスペースの複雑さに関するダイエット・クールのコメントの余分な説明を参照してください。アルゴリズムを最初から実装する 'std :: memmem' isoを再利用すると、これらの引数は変更されません。 – KillianDS