例えば。乱数で配列を生成する関数があります。
int[] generateNum(int n) {
int[] result = new int[n];
/* Logic to generate random number */
...............
return result;
}
次に、上記のプログラムのスペースの複雑さはO(n)またはO(1)?
この質問は、スペースの複雑さに関するものであり、データ構造の保持を数えるかどうかがスペースの複雑さをもたらすかどうかについて非常に具体的です。
関数またはアルゴリズムがn
のメモリのアトミックアイテムを割り当てるとき
int[] result = new int[n];
その場合、この配列の用途に関係なく、少なくともO(n)のスペースの複雑さがあります。一部の結果を返すためだけに使用される場合、または完全に異なる目的のために使用される場合は問題ではありません。
ただし、多くのプログラミング言語では、ストリームまたはジェネレータ式を利用して、空間の複雑さがO(1)のままである方法で、任意の数のアイテムのシーケンスを返すことができます。たとえば、C#では次のように記述できます。
IEnumerable<int> generateNum(int n)
{
for(int i=0;i<n;++i)
{
r= /* expression to generate random number */;
yield return r;
}
}
結果をどのように処理するかは呼び出し元次第です。連続して処理する場合、スペースの複雑さはO(1)のままです。結果がすべてリストまたは配列に格納されている場合、スペースの複雑さは再びO(n)になります。
(Javaでは、これもIterable<int>
を使用して可能であるようですが、 さらにコードが必要になるようです )。