n
ノードと高さを備えた完全にバランスの取れたバイナリ ツリーで機能する再帰関数がlog(n)
あり、ツリーのルートで以下の関数を呼び出すとします。
void printPaths(TreeNode root, int[] array, int depth){
if (root == null){
print array;
}
array[depth] = root.data;
printPaths(root.left, array, depth + 1);
printPaths(root.right, array, depth + 1);
}
array = new int[depthOfTree]
printPaths(root, array, 0);
配列を長さlog(n)
とします (ツリーのパスに沿って値を格納します)。再帰呼び出しスタックが max height になることはわかっていますlog(n)
。Java の「値渡し」の性質と Java ガベージ コレクションが時間と空間の複雑さにどのように影響するのか、私にはよくわかりません。
1) 配列を再帰呼び出しに渡す時間の複雑さは? Java が「値渡し」の場合、各再帰呼び出しはO(log(n))
、関数の実行を開始する前に配列をコピーするだけで済みますか?
2) これらの配列のコピーがメモリ内で一度にいくつ浮遊するかの上限は? 私の傾向は言うことO(log(n))
です。それは空間の複雑さが であることを意味しますO(log(n)log(n))
か? O(log(n))
「スペースの複雑さは、アルゴリズムが再帰O(log(n))
回数を繰り返し、パスパラメーターがO(log(n))
再帰中にスペースで1回だけ割り当てられるためです」という本を読んだことがあります。