2016-09-22 7 views
4

今日のアルゴリズムに関する古いノートをレビューしていましたが、これが私の考えです。この関数の時間複雑度はO(1)ですか?

複雑度O(1)は、関数の実行時間がデータとは独立していることを意味します。

配列のすべての要素を追加する関数があるとしましょう。

int add(int[] array){ 
    int sum =0; 
    for (int i=0;i<ARRAY_MAX_SIZE;i++){ 
     sum= sum + (i<array.length?array[i]:0); 
    } 
    return sum; 
} 

ここで、ARRAY_MAX_SIZEは可能な最大サイズの配列です。私はこのコードが効率的ではないことを知っています。私はこれについて議論したくありません。しかし、演算子+は毎回同じ量の時間と呼ばれ、データのサイズの影響を受けません。

これは、この関数の複雑さがO(1)であることを意味しますか?

+2

複雑さは 'O(ARRAY_MAX_SIZE)'です。 'ARRAY_MAX_SIZE'が定数の場合、' O(ARRAY_MAX_SIZE)== O(1) ' – Eric

+0

@Ericは私が思ったものですが、私の一部はこれを受け入れることができませんでした。 – user902383

+0

実際、それは必ずしも真実ではありません。私の答えを参照してください – Eric

答えて

6

はい。 O(1)は、一定時間を意味し、高速/効率/最適ではありません。

Big-Oの複雑さは、一定のステップの複雑さを無視します。除算(遅い)は、インクリメント(高速)と同様に「複雑」です。

+0

あなたは正しいのですが、なぜか分かりませんが、O(1)はO(N)よりも効率的であると仮定しています。ありがとうございました。 – user902383

+1

私は* O(0.001)*は既に定数であると考えられていますが、速すぎると考えています:-) –

-1

配列のサイズが最大であれば、複雑さはO(1)になります。しかしこれには別の結果があります。 array.lengthARRAY_MAX_SIZE,未満であることが必要となるので、array.lengthも同様に、次のO(1)を作り、定数によって制限さ:

for(int i=0; i<array.length; i++) { 
    sum = sum + array[i]; 
} 

だから我々は、通常は、アルゴリズムの複雑さのために有用な結果を得るために、配列サイズ上の任意の制限を無視すると思います。

これは明らかにARRAY_MAX_SIZEが配列の最大可能サイズ(質問で定義されている)であり、他の値ではないと仮定しています。

+0

'array.length'はこれより少ないことは必須ではありません。' ARRAY_MAX_SIZE' – Amit

+0

@Amitどうしたらいいですか?長さは最大長よりも短くなければなりません。そうでなければ最大ではありません – fgb

+0

あなたはtitleと値を混同しています。 – Amit

4

実際の回答は「それに依存する」です。ここで起こって物事の異なる2組あります

  • ARRAY_MAX_SIZE回、あなた:
    • インクリメントとは
    • が総
  • array.lengthに追加するループをテスト回、あなた:;
    • アクセスarray[i]
  • ARRAY_MAX_SIZE - array.length回、あなた:;
    • 負荷定数ゼロ

だから、合計ランタイムは

t = k_1 * ARRAY_MAX_SIZE + 
    k_2 * n + 
    k_3 * (ARRAY_MAX_SIZE - n) 

だから、あなたはどのようk_2を見て、k_3比較です。彼らは基本的に等しいのですか?その後、それはO(1)です。 k_2 >> k_3ですか?その後、それはO(n)です。

なぜでしょうかk_2 >> k_3array[i]はメモリアクセス、およびmemory is comparatively very slowですので:唯一興味深い部分がある

2

array[i]のみn回使用されています。つまり、i番目の要素がn回になるように配列を参照する操作を追加します。私はこれを通常は数えませんが、これはおそらくO(n)になりませんか?ちょうど悪魔の主張を果たしている。

私はこれが本当にO(1)に相当すると思います。

int add(int[] array){ 
    int sum =0; 
    int len = array.length; 
    for (int i=0;i<ARRAY_MAX_SIZE;i++){ 
     sum= sum + array[i%len] & (i < len ? 0xFFFFFFFF : 0); 
    } 
    return sum; 
} 
+0

なぜこれは 'O(-n)'ではなく 'O(1)'ですか?それぞれのミスは2倍の配列検索をしてくれます! – Eric

+0

@Eric参照と計算の数は配列の長さにまったく依存しないためです。 – SGM1

+0

':'の片側には 'array ['を一度参照し、もう一方はもう一度参照します。どの辺が実行されるかは、配列の長さによって異なります。 – Eric

関連する問題