堆函数是否会在函数调用时在堆栈上复制?

时间:2014-12-17 19:56:21

标签: java recursion space-complexity

在Java中,调用方法时是否会在堆栈上复制堆栈对象?考虑一下这段代码 -

static void mirror(Node p){
    if (p!=null) {
        Node temp = null;
        temp = p.left;
        p.left = p.right;
        p.right = temp;

        mirror(p.left);
        mirror(p.right);
    }
}

空间复杂性是否会 -

  1. O(n)因为在每次递归调用时都会在堆栈上推送/复制Node对象
  2. O(1)因为Node对象已经在内存中而p只是对它的引用
  3. O(n)因为在方法调用
  4. 上正在堆栈上推送引用p

    编辑:其中n是树的深度

2 个答案:

答案 0 :(得分:2)

他们两个都没有。

在传递对方法调用的参数的引用时,对象被复制,但引用本身仍然占用堆栈空间,因此空间复杂度为O(n),假设n }指的是二叉树的深度。

O(…)表示法忽略了常量比例因子,因此O(n)仅表示每次递归都需要一定量的堆栈空间,如果没有将任何参数传递给调用,则甚至为真方法。它没有说明需要多少空间。


编辑:现在你已经编辑了你的问题添加第3点,它是第3点,但并不完全是因为,如上所述,即使你没有在堆栈上推送引用,也需要堆栈空间。


另请注意,您必须明确n所指的内容。如果n是树的Node总数,那么如果树是平衡的,则相当O(log(n))。但如果n是树的最大深度与最大递归深度相匹配,那么它是O(n)

答案 1 :(得分:0)

对象p不会在堆上复制,但对于每次递归,对p的引用都将放入堆栈中。