21

strlen私は、の使用はこのようなテストよりも費用がかかることを読みました:

x100文字の文字列があります。

私はそれを思います

for (int i = 0; i < strlen(x); i++)

このコードよりも高価です:

for (int i = 0; x[i] != '\0'; i++)

それは本当ですか?状況によっては2番目のコードが機能しない可能性があるため、最初のコードを使用する方がよいでしょうか。

以下の方がいいのでしょうか?

for (char *tempptr = x; *tempptr != '\0'; tempptr++)
4

8 に答える 8

36
for (int i=0;i<strlen(x);i++)

このコードはstrlen(x)すべての反復を呼び出しています。したがって、xが長さ100の場合、 strlen(x)100回呼び出されます。これは非常に高価です。また、forループと同じように毎回strlen(x)繰り返します。xこれにより、O(n ^ 2)の複雑さになります。

for (int i=0;x[i]!='\0';i++)

このコードは関数を呼び出さないため、前の例よりもはるかに高速になります。ループを1回だけ繰り返すため、O(n)の複雑さです。

于 2010-08-02T13:17:29.773 に答える
12

最初のコードはiの反復ごとにxの長さをチェックし、最後の0を見つけるのにO(n)が必要なので、O(n ^ 2)が必要です。2番目のケースはO(n)です。

于 2010-08-02T13:10:40.427 に答える
5

はい、あなたの秒は100%の確率で機能しないかもしれませんが、それはかなりわずかです。これは、strlen()を使用する場合、毎回メソッドを呼び出す必要があるためです。より良い方法はそうなるでしょう

int strLength = strlen(x);
for (int i = 0; i < strLength; i++)

お役に立てれば。

于 2010-08-02T13:13:59.320 に答える
4

最初のバリアントでは反復ごとにstrlenが見つかりますが、2番目のバリアントではそうしないと思います。
これを確認してみてください:

int a = strlen(x); 
for (int i = 0; i < a; i++) {...}
于 2010-08-02T13:12:09.563 に答える
2

いいえの場合、コンパイルの最適化はありません。はい。strlenは文字列のすべてのバイトを毎回反復し、2番目の実装はそれを1回だけ実行するためです。

于 2010-08-02T13:12:19.703 に答える
2

コンパイラーは最初のforループを最適化できると思います(Gregory Pakoszのコメントを確認してください)。

int len = strlen(x);
for (int i = 0; i < len; i++)

まだO(n)です。

forとにかく、2番目のループは速くなると思います。

于 2010-08-02T13:12:53.610 に答える
0

文字列を含むバッファのサイズに対してインデックスもテストしないと、バッファオーバーフローの問題が発生する可能性があることに注意してください。このコードで何をしているのかによって、これは実際的な問題である場合とそうでない場合がありますが、追加のチェックを行うことで問題が発生することはめったにありません。

私が提案するのは:for(i = 0; i <buf_size && x [i]!='\ 0'; i ++)

どこ:

  • buf_sizeはバッファの所定のサイズです。xが配列の場合、これはsizeof(x);になります。xがポインタの場合、バッファサイズを使用できるようにする必要があります。
  • i有効なc99のみであるため、ループからの宣言を削除しました。c99でのみコンパイルしている場合は、自由に元に戻してください。
于 2010-08-02T17:22:36.820 に答える
-1

もちろん、最初のものは2番目のものよりも時間がかかります。実際にはまったく同じことはしません。最初の方法は、毎回文字列の長さを計算することです。2つ目は、(効果的に)1回だけ実行することです。

最初のバージョンはこれと同等です:

for (int i=0; x[i] != 0; i++)
  for (int j=0; j<i; j++)
    ;

「自分でライブラリを実装するよりも、ライブラリstrlen()を呼び出す方が効率的ですか?」と言うつもりだったのかもしれません。その答えは、もちろん「状況次第」です。コンパイラーには、ソースから期待されるものを超えて最適化されたstrlen()の組み込みバージョンが含まれている場合や、関数呼び出しが高価な(最近ではまれな)プラットフォーム上にある場合などがあります。

一般的で正しい唯一の答えは「プロフィールを調べて調べる」です。

于 2010-08-02T13:13:55.253 に答える