サイズNの配列があり、Nは<= 200です。
ここでのスペースの複雑さは何でしょうか。
O(1)または(N)-制約Nを考慮します。
複雑さは、さまざまな入力を使用してアルゴリズムのパフォーマンスを予測しようとする場合にのみ関係します。コンテキストなしで配列の空間の複雑さについて話すだけでは意味がないと思います。
サイズN(ハードコードされた)の配列を常に作成する場合、それはO(1)です。これは、アルゴリズムがどの入力を処理しても、配列が占めるスペースは同じだからです。
Nが入力のサイズとともに大きくなる場合、それはO(f(n))です。ここで、f(n)はn(入力のサイズ)間の関係です。 )およびN(配列のサイズ)。
注:定式化O(...)は、乗数に関係なく大きさを表す数学記号です(精度が不足しているため、申し訳ありませんが、数学の学位を超えており、決して英語の用語を学んだ)ので、Nが定数の場合、O(N O(1))==(まったく同じ意味です)。
そして、私がそれを正しく覚えているなら、iff<C *g、O(f) = O(g)。したがって、Nが<200の場合、O(N) = O(200) = O(1)
スペースの複雑さは通常、アルゴリズムに対してのみ定義されます。
しかし、狡猾になり、質問からアルゴリズムを作成しましょう。
Input: N values, N <= 200
Algorithm: Store all values
Output: None
スペースの複雑さは、Nに関連して、アルゴリズムを実行するために必要なメモリの量です。
1つの数値を格納する場合、1つのメモリ領域が必要になります。 2を格納すると、2倍になります...メモリの複雑さはO(n)です。これは、線形に増加することを意味します。このアルゴリズムの場合と同じように:
Input: N values, N <= 18,446,744,073,709,551,616 (unsigned int 64).
Algorithm: Store all values
Output: None
しかし、200は本当に小さい数です、O(1)とだけ言うことはできませんか?
このO(1)を作成できるので、もう一度巧妙になりましょう。
Input: N values, N <= 200
Algorithm: Store all values in an array of size 200
Output: None
1つの数値を格納する場合、200のメモリ領域が必要になります。 2つの数値を格納する場合、200のメモリ領域が必要になります。 200個の数値を格納する場合、200個のメモリ領域が必要になります。これは、メモリが一定でNから独立していることを意味します。したがって、複雑さはO(1)です。
O(1)は、必要なメモリの量が1であることを意味するのではなく、必要なメモリの量がNとは関係がないことを意味することに注意してください。したがって、 Nが大きくなると大きくなりません。
ただし、オブジェクトが50GBのBlu-rayディスクの場合はどうなりますか?O(1)は非常に小さいはずですが、今では10テラバイトになります!
この時点で、BigO表記を常に使用する必要はないことにようやく気付くかもしれません。 10テラバイトのデータを保存し、ハードディスクを購入する必要があると言えます。あなたの先生があなたがO(1)を非常に小さいNまたはO(n)に対して書くかどうかについて大騒ぎするなら、彼は非常に悪い先生です。この質問への答えはどちらも行きませんあなたの人生もあなたのキャリアも変えてください。Big O Notationは、信じられないほど大きくなる可能性のある数字にのみ意味があります。
問題のケースによって異なります。一定量のメモリ(またはスペース)のみを使用する場合。したがって、スペースの複雑さはO(1)です。
ただし、N個の要素を保持するように設計された1D配列のようなデータ構造があり、Nが入力ごとに異なる場合、必要なメモリの量はNに依存します。Nが小さい場合、必要なスペースも小さいです。 Nが大きいと、必要なスペースも大きくなります。したがって、必要なスペースと入力サイズには線形依存性があります。つまりO(N)スペースです。
同様に、サイズNxNの2D配列がある場合、通常、必要なスペースはO(N ^ 2)です。
アルゴリズムに必要な最小スペースを見つける次の例を検討してください。
Scanner in = new Scanner(System.in);
int n = in.nextInt();
int[] array = new int[n];
for(int i = 0; i < n; i++){
array[i] = in.nextInt();
}
int minimum = array[0];
for(int i = 0; i < n; i++){
if (array[i] < minimum){
minimum = array[i];
}
}
System.out.println(minimum);
ここでは、サイズがn
によって変化する配列があります。合計スペース要件= 2 + N
、 どこ 2
は変数n
およびminimum
用であり、N
はarray
用です。したがって、このアルゴリズムのスペースの複雑さはO(N)です。
これがあなたが探していたものだったと思います。
スペースサイズがnの増加に比例して増加する場合、スペースの複雑さはO(n)ですが、あなたの場合、関数は200以降のnに依存しません。 ; f(n)= a * n + b。。
サイズNの配列があり、Nは<= 200です。
サイズNの配列があります。どうですか?つまり、この配列(スペース)を使用するコード(アルゴリズム)のようなコンテキストがないため、一部のデータを格納することは、スペースの複雑さに関しては何の意味もありません。したがって、何もないスペースの複雑さを測定することはできません(実行するコードはなく、データがそこにあるだけです)。
ここで、この入力配列のN倍を作成する関数のようなコンテキストでこの配列を使用すると(N <=この配列の長さ)、実行時間(実行されたステートメント/行の数)に関連してスペースがどのように増加するかを測定できます。この関数。
ここでのスペースの複雑さは何でしょうか。
O(1)または(N)-制約Nを考慮しますか?
この場合、実行するコードがないため実行時間の増加がないため、スペースの複雑さはO(1)になります。データ(配列)は1つだけです。
これがお役に立てば幸いです