Javascript 前序遍历迭代与递归时间复杂度
我正在为我的web应用程序使用树。例如,创建一个profil站点,每个profil可以有0..n个好友。还有,我想在最好的时候找个朋友。为此,我使用了二叉搜索树和Breadh First Search(BFS) 我测量了两个函数在递归和迭代列表中搜索朋友的时间,我惊讶于递归函数更快。我认为iterativ函数比iterative函数更快,我在迭代函数中只使用了一次while循环,时间复杂度为O(n)。有人能解释一下这里的错误以及递归函数更快的原因吗: 时间递归:1.3000000035390258Javascript 前序遍历迭代与递归时间复杂度,javascript,data-structures,Javascript,Data Structures,我正在为我的web应用程序使用树。例如,创建一个profil站点,每个profil可以有0..n个好友。还有,我想在最好的时候找个朋友。为此,我使用了二叉搜索树和Breadh First Search(BFS) 我测量了两个函数在递归和迭代列表中搜索朋友的时间,我惊讶于递归函数更快。我认为iterativ函数比iterative函数更快,我在迭代函数中只使用了一次while循环,时间复杂度为O(n)。有人能解释一下这里的错误以及递归函数更快的原因吗: 时间递归:1.300000003539025
preorderRec(root){
if(root === null) {
return;
}
console.log(root.data);
if(root.left) {
this.preorderRec(root.left);
}
if(root.right) {
this.preorderRec(root.right);
}
return root;
}
迭代时间:0.99700001117587
preOrderIterativ(root) {
if(root === null) {
return;
}
const stack = [root];
const stack2 = [];
while(stack.length) {
//const node = stack.pop();
const node = stack.pop();
stack2.push(node)
if(node.left) {
stack.push(node.left)
}
if(node.right) {
stack.push(node.right)
}
}
return stack2;
}
}
解决方案:问题在于while循环中的console.log。我使用repl.it作为编辑器,在删除console.log之后,性能得到了改进在迭代解决方案上,您正在使用另一个数据结构(
数组
)。除此之外,您还不断执行插入推送
和删除弹出
操作。这些操作中的每一个都是时间复杂度O(n)
。对于递归解决方案,您使用的是调用堆栈
,这就是javascript
的运行方式。我不知道这是什么大O。这是完整的代码吗?您的预排序函数遍历树,但不执行任何操作。没有像迭代版本中那样的推送、弹出或返回,迭代版本看起来不会看到超过1个节点。preOrderIterativ函数的逻辑不正确,是上面给出测试结果的同一个程序吗?java
!=<代码>javascript。来吧,它甚至在这两者的工具提示中都这么说!!!嗨,递归函数只是返回root@NicholasTowerpreorderec
代码记录所有节点数据preOrderIterativ
有缺陷,只记录树根的数据,因为它从不迭代子级。Ok奇怪。我怎样才能使它成为堆栈?我认为添加和删除操作是O(1)。我不明白数组和堆栈的不同之处。如果我创建一个函数add而不是使用push功能,那有什么不同呢?您可以手动创建一个链表并将其用作堆栈。这将为您提供O(1)插入和删除。