web-dev-qa-db-ja.com

関数のスペースの複雑さを計算する方法は?

私は、私がこのような機能を持っている場合、

_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ユニット、inには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)?それとも最大のものですか?

15
Ankur Anand

スペースの複雑さについて説明する場合、入力で使用されるスペースは考慮されません。

これにより、定数空間、O(log n)空間などのアルゴリズムについて説明できます。入力のカウントを開始した場合、すべてのアルゴリズムは少なくとも線形空間になります。

スペースの複雑さに関する標準のマルチテープチューリングマシン定義でも、出力はカウントされません。

入力は読み取り専用で、出力は書き込み専用であり、スペースの複雑さにはカウントされません。

だからあなたの質問に答える:再帰/ローカル変数などのスタックスペースなど、メソッドが割り当てるメモリを探してください。それがスペースの複雑さを決定します。

9

アルゴリズムまたはデータ構造のスペースの複雑さは、アルゴリズムへの入力で使用されるスペースを無視して、一度に使用されるスペースの最大量です。したがって、質問の3つの例すべてのスペースの複雑さはO(1)です。

8
user3311298