我在学习时间和时间空间复杂性。我递归地解决了二叉树问题。反复。递归使用底层堆栈,因此例如:
如果我想在BST中找到最小元素,那么如果我使用递归,那么我的空间复杂度将是
Worst case : O(n) if tree is left skewed OR
best case: O(1)
average case: O(h) height of left subtree
但如果我使用迭代解决这个问题,那么空间复杂度是多少?迭代方法的空间复杂度与递归方法相同如何?我在这里没有使用任何辅助空间,我只是使用1 while循环。我在这里很困惑。
迭代方法
int minValue(struct node* node) {
struct node* current = node;
/* loop down to find the leftmost leaf */
while (current->left != NULL) {
current = current->left;
}
return(current->data);
}
答案 0 :(得分:5)
如果使用递归方法,那么在每个阶段,您都必须进行递归调用。这意味着将当前调用留在堆栈上,并调用一个新调用。当你深入 k 级别时,你已经 k 大量的堆栈帧,因此空间复杂度最终与你所拥有的深度成正比搜索范围。
使用迭代代码,您可以为调用(O(1)空间)分配一个变量(O(1)空间)和单个堆栈帧。您的while
循环无法通过创建新变量或对象实例或通过进行更多递归调用来分配任何额外内容。因此,对于整个调用,您需要的唯一空间是由您创建的变量和堆栈帧的其余部分占用的O(1)空间。
每当你可以将递归算法重写为一个简单的迭代时,由于空间需求的减少,它值得做。
答案 1 :(得分:0)
如果使用一个循环和一定数量的变量,那么在最坏的情况下迭代方法需要O(1)
空间。它与递归的不同。