私はいくつかの面接の準備をしていた間、私はこの質問に出くわしました。
public class Main {
public static void main(String[] args) {
// n is some user input value
int i = 0;
while (i < n) {
int[] a = new int[n];
for (int j = 0; j < n; j++){
a[j] = i * j;
}
i++;
}
}
}
与えられた選択肢は以下の通りでした。
- O(N)
- O(N ^ 2)
私は答えを理解して何から、すべての配列の新しいインスタンスが作成されている反復と前の参照が失われているのようにO(n)とされている必要があります。しかし、この本は、O(N ^ 2)であるとの回答を言及しています。
可能な説明は何だろうか?
説明
あなたの説明は正しいです。スペースの複雑さがある線形。
しかし、あなたの結論(や書籍の著者の結論は)間違っています。正解はということです両方の答えが正しいです。それは、宇宙の複雑さが両方にある、次のとおりです。
O(n)
そしてO(n^2)
ビッグOは、正確な拘束されない、上限を与えます。それについて考える<=
だけではなくとして=
。もしそうならa in O(n)
、ことも事実であるa in O(n^2)
(数学的に、ビッグ-Oは、関数のセットを提供します)。
正確な結合によって与えられるシータ(=
)および下部によって結合オメガ(>=
厳密下限は次式で与えられ)、小オメガ(>
)および上部によって結合厳密小O(<
)。だから宇宙の複雑さはですTheta(n)
。
参照してくださいウィキペディアをより多くの情報と実際の数学的な定義について。
ノート
スペースの複雑さがあるだけで、リニア我々はJavasのガベージコレクタがあると仮定した場合に有効。それを無効にするか、空きメモリ(参照実際にはないモック実装によってそれを置き換えることが可能であるイプシロン-GCを)。
その場合には、スペースの複雑さは確かだろう次。
アルゴリズム自体はする必要が割り当てるメモリの二次量を。しかし、それは今まで保持するリニア同時にメモリの量を。宇宙複雑分析は、一般的に、同時にホールドなければなりませんどのくらいのメモリに関して行われます。しかし、おそらく著者はまた、彼の選択を説明することができ、合計で割り当てられることにどれだけのニーズに関してアルゴリズムを分析したかったです。