这个例程使用了多少堆栈空间?

时间:2011-09-27 22:02:30

标签: algorithm

假设树是平衡的,那么常规用于1,000,000个元素的树的堆栈空间是多少?

void printTree(const Node *node) {
  char buffer[1000];
  if(node) {
    printTree(node->left);
    getNodeAsString(node, buffer);
    puts(buffer);
    printTree(node->right);
  }
}

这是“实用程序员”中的算法问题之一,答案是需要21个缓冲区(lg(1m)〜= 20,另外1个位于最顶层)

但是我认为它需要多于1个缓冲区,其级别低于顶级,因为左侧和右侧节点有2个自身调用。有没有我错过的东西?

*对不起,但这不是一个功课。在书店的勘误表上看不到这个。

2 个答案:

答案 0 :(得分:4)

首先进行左节点调用,然后该调用返回(因此它的堆栈可以重复使用),然后进行一些工作,然后进行正确的节点调用。

所以确实下一级有两个缓冲区,但这两个缓冲区是连续需要的,而不是并发的。因此,您只需要在高水位标记堆栈使用中计算一个缓冲区。重要的是函数的递归深度,而不是函数调用的次数。

这当然假设代码是用类似于C的语言编写的,并且C实现使用堆栈来自动变量(我还没有看到一个没有的),等等等等等等。

答案 1 :(得分:1)

第一个调用将一直递归到叶节点,然后返回。然后第二个呼叫将开始 - 但是当第二个呼叫发生时,第一个呼叫的所有激活记录都将从堆栈中清除。 IOW,在任何给定时间,只有来自堆栈中其中一个的数据。