当前位置: 首页 > 知识库问答 >
问题:

为什么平衡BST中节点值之和的时间复杂度是O(n)?

公西俊才
2023-03-14

我正试图学习大O符号,我遇到了一个问题。在这段代码中,我们试图找到节点值的总和。并且由于有2个求和函数的调用,所以每个调用的调用次数将是以前的两倍。所以为什么运行时是O(n)而不是O(2^n)。

int sum(Node node) {
   if(node==null)
      return 0;
   return sum(node.left) + node.value + sum(node.right);
}

共有1个答案

燕超
2023-03-14

当查看这些时,您的推理是部分正确的,这确实是指数的--但在h中--而不是在n中(其中h是树的高度)--因为在每次迭代调用中,您都有h-1更多的节点要去,最后产生O(2^h)

但是,在这里,n是树中的节点数。这在O(n)中运行,因为每个节点都被准确地遍历一次--其中有n,从而给出了O(n)的总数。

 类似资料:
  • 我很难找出平均和最坏情况下的时间复杂度。因此,我使用以下逻辑删除了BST节点 删除二元搜索树中的节点时,有3种情况 那么,如何计算总体平均时间复杂度和最差时间复杂度??

  • 假设T是具有n个节点和高度h的二叉查找树。T的每个节点x存储一个实数x。键。给出以下算法Func1(T. root)的最坏情况时间复杂度。你需要证明你的答案。 x.left() 对于最坏情况下的运行时,我认为这将是O(树的高度),因为这基本上类似于最小()或最大()二元搜索树算法。然而,它是递归的,所以我对是否将O(h)作为最坏的运行时编写有点犹豫。 当我考虑它时,最坏的情况是如果函数执行if(s

  • 问题内容: 我刚刚开始学习数据结构,并且在进行数组插入时想知道为什么数组插入的时间复杂度为O(n)而不是O(n + 1)? 在最佳情况下,当插入在最后时,时间复杂度为O(1)。我想我们正在考虑1插入元素,因为这里没有元素被移动。在最坏的情况下,假设我们必须移动n个元素然后插入新元素,那么时间时间复杂度是否应该为O(n + 1)?n用于移动元素,1用于插入。 非常感谢您的帮助。 问题答案: O(n)

  • 问题内容: 来自redis doc: ZPOPMIN键[count]自5.0.0起可用。 时间复杂度:O(log(N)* M),其中N为排序集中元素的数量,M为弹出元素的数量。 删除并返回存储在key排序集中的得分最低的成员。 因此,我的问题是,如果列表已排序,为什么要使用log n,为什么不使用O(1)? 问题答案: 如果 列表 已排序,为什么要使用log n,为什么不使用O(1)? 如果使用列

  • 问题内容: 从TimeComplexity文档中可以看出,Python的类型是使用数组实现的。 因此,如果正在使用数组并且进行了一些附加操作,最终您将不得不重新分配空间并将所有信息复制到新空间。 毕竟,这是O(1)最坏的情况吗? 问题答案: 如果查看链接文档中的脚注,您会发现它们包含一个警告: 这些操作依赖于“最坏情况摊销”的“摊销”部分。根据容器的历史记录,各个动作可能会花费惊人的时间。 使用摊

  • 我不明白堆排序的空间复杂度是怎样的O(1)?虽然快速排序不使用任何额外的数组(即就地),但在最坏情况下其空间复杂度为O(n),在最佳情况下为O(lg n),因为在递归调用的后端使用堆栈。我说得对吗? 堆排序也是如此。虽然,它是就地的,但是由于Build-Heap函数调用Max-Heapify函数,所以它的空间复杂度应该等于Max-Heapify,即O(lg n)。不是吗?此外,稍后在根节点调用Ma

  • 就像谷歌地图一样,给定一百万个经纬度坐标列表,你将如何打印距离给定位置最近的k个城市? 我在一次面试中问了这个问题。面试官说这可以在O(n)中通过使用插入排序到k来完成,而不是对整个列表进行排序,即NlogN。我在网上找到了其他答案,大多数人都说NLogN...他[面试官]正确吗?

  • 有一个循环执行蛮力算法来计算5*3,而不使用算术运算符。 我只需要加5 3次,这样它就需要O(3),如果输入是x*y,它就是O(y)。但是,在一本书中,它说它需要O(2^n),其中n是输入中的位数。我不明白为什么它用O(2^n)来表示它O(y)。这是显示时间复杂度的更好方法吗?。你能解释一下吗? 我没有要求其他算法来计算这个。