【问题标题】:Time and space complexity of passing an array in JavaJava中传递数组的时间和空间复杂度
【发布时间】:2013-07-23 10:30:12
【问题描述】:

假设我有一个递归函数,它适用于具有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)(它将沿树的路径存储值)。我知道递归调用堆栈将是最大高度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)) 空间分配一次”。

【问题讨论】:

    标签: java recursion time-complexity pass-by-value space-complexity


    【解决方案1】:

    1) 将数组传递给递归的时间复杂度是多少 称呼?如果 Java 是“按值传递”,那么每个递归调用都需要 O(log(n)) 在启动任何函数之前简单地复制数组 执行?

    Java 不复制数组。在 Java 中,您将 Object 的引用作为方法中的参数传递。所以当 Object 的数据发生变化时,它会反映到所有引用它的引用中。

    【讨论】:

      【解决方案2】:

      1) 将数组传递给递归调用的时间复杂度是多少?如果 Java 是“按值传递”,是否每次递归调用都需要 O(log(n)) 在开始执行任何函数之前简单地复制数组?

      只需 O(1)。 reference 是按值传递的。数组是引用类型(即使数组的 element 类型是值类型,例如 int[])。

      所以array 表达式的值不是数组对象本身——它只是一个引用。

      2) 任何时候这些数组副本中有多少在内存中浮动的上限是多少?

      正是 1,出于同样的原因。你有 一个 数组,堆栈中的每一层都有一个对它的引用。

      每个递归步骤所占用的唯一额外内存是堆栈上的局部变量值的足够空间......这是每次调用的恒定空间量。深度为 O(log(N)),空间复杂度也为 O(log(N))。

      【讨论】:

        猜你喜欢
        • 2019-04-21
        • 2012-08-14
        • 1970-01-01
        • 2011-08-04
        • 1970-01-01
        • 1970-01-01
        • 2018-02-10
        • 2019-03-02
        • 2018-07-23
        相关资源
        最近更新 更多