以下のコード例の 2 つのバリアントのランタイムの複雑さが技術的に同じかどうかを知りたいです。
例(そして、ポイントを作るために、文字列の長さが偶数であるとしましょう):
//counting how many times char 'c' appear in the string s
String s = "ascdwcccdweccaaa"; //the "array", contain char 'c' 6 times
int counter = 0; //times char 'c' appear in the string
for(int i=1; i <= s.length()/2; i++)
{
if(s.charAt(i-1) == 'c')
counter++;
if(s.charAt(s.length()-i) == 'c')
counter++;
}
これに比べると…
for(int i=0; i < s.length(); i++)
if(s.charAt(i) == 'c')
counter++;
最初の例では、インデックスを使用して、配列の最後と最初の両方から、配列の中央に到達するまでチェックします (おそらくO(n/2)
)
2番目の例では、配列内のすべての文字を最初から最後まで厳密にチェックしています(おそらくO(n)
)
最初の例では two を使用する必要がifs
あり、2 番目の例では one を使用する必要がありますif
。
これら 2 つのコードは、時間の複雑さにおいて技術的に同一ですか? ifs
(最初の例で配列の半分だけを渡すときに2 つを使用するという事実を考えると、それらは「均一化」されますか?)