私は、私がこのような機能を持っている場合、
_int sum(int x, int y, int z) {
int r = x + y + z;
return r;
}
_
パラメータには3ユニット、ローカル変数には1ユニットのスペースが必要です。これは決して変更されないため、これはO(1)
です。
しかし、私がこのような関数を持っているとどうなりますか?
_void add(int a[], int b[], int c[], int n) {
for (int i = 0; i < n; ++i) {
c[i] = a[i] + b[0]
}
}
_
a
にはNユニット、b
にはMユニット、c
にはLユニット、i
とn
には1ユニットが必要です。したがって、_N+M+L+1+1
_のストレージ容量が必要になります。
では、ここでのスペースの複雑さのビッグOは何でしょうか?より多くのメモリを必要とする方ですか?つまりNがMとLよりもより高いメンバーを取る場合(はるかに高いということは、_10**6
_よりも大きいと仮定する)-したがって、空間の複雑性はO(N)
であると言っても安全ですか?
しかし、3つすべて、つまり、a、b、cがそれほど変わらない場合
この機能のように
_void multiply(int a[], int b[], int c[][], int n) {
for (int i = 0; i < n; ++i) {
for (int j = 0; j < n; ++j) {
c[i] = a[i] + b[j];
}
}
}
_
では、スペースの複雑さはどうなるでしょうか。 O(N+M+L)
?それとも最大のものですか?
スペースの複雑さについて説明する場合、入力で使用されるスペースは考慮されません。
これにより、定数空間、O(log n)空間などのアルゴリズムについて説明できます。入力のカウントを開始した場合、すべてのアルゴリズムは少なくとも線形空間になります。
スペースの複雑さに関する標準のマルチテープチューリングマシン定義でも、出力はカウントされません。
入力は読み取り専用で、出力は書き込み専用であり、スペースの複雑さにはカウントされません。
だからあなたの質問に答える:再帰/ローカル変数などのスタックスペースなど、メソッドが割り当てるメモリを探してください。それがスペースの複雑さを決定します。
アルゴリズムまたはデータ構造のスペースの複雑さは、アルゴリズムへの入力で使用されるスペースを無視して、一度に使用されるスペースの最大量です。したがって、質問の3つの例すべてのスペースの複雑さはO(1)です。