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

如果在BST中获得无序继任者需要O(h),为什么迭代无序遍历在调用O(h)函数n次时需要O(n)?

臧亦
2023-03-14

在BST中,获取给定节点的顺序后续节点需要O(h)个时间复杂度,因此给定getNext(),它获取当前节点的顺序后续节点,则需要n次调用getNext()来遍历树,从而获得O(nh)个时间复杂度。

然而,书籍中给出的BST的迭代顺序遍历需要O(n)时间。我不明白为什么会有区别。

(节点具有父指针)。

共有1个答案

井唯
2023-03-14

获取有序后继者是O(h),而不是Ө(h)。一半的节点将有一个后继节点,距离只有一条链路。让我们考虑一下遍历给定节点所需的指针解引用次数:

  • 遍历左子树的指针解引用数,加上
  • 从左子树最右侧节点向后上升的数字=左子树的高度(最多),加上
  • 一个用于节点本身,加上
  • 下降到右子树最右侧节点的数目=右子树的高度(最多),加上
  • 右子树的编号

所以上界是:

f(0)=1
f(h)=f(h− 1) (h)− 1) h(h− 1) f(h− 1)

f(h)=5·2h−3h−4

和h的存在⌈日志₂ n⌉, f是O(n)。

 类似资料:
  • 问题内容: 我编写了两种方法的代码,以找出LeetCode字符串中的第一个唯一字符。 问题陈述: 给定一个字符串,找到其中的第一个非重复字符并返回其索引。如果不存在,则返回-1。 示例测试用例: s =“ leetcode”返回0。 s =“ loveleetcode”,返回2。 方法1(O(n))(如果我错了,请纠正我): 方法2(O(n ^ 2)): 在方法2中,我认为复杂度应为O(n ^ 2

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

  • 做O(h)算法的时间复杂度是多少?当h是节点的高度,以BST n倍为单位(树中的元素数),我相信是O(n),而不是O(n*h),但我不知道如何证明它。 在O(h)中工作的特定算法是在BST中查找元素的顺序前体。

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

  • 问题内容: 我最近在Android Studio中将我的android SDK和构建工具更新为API 26,当我执行以下操作时,我直接注意到Android Studio将我的视图演员标记为“冗余”: 经过一些研究,我发现自SDK 26起,使用Java 8功能来返回相同的对象类型,但是我想知道的是,删除所有强制类型转换是否完全安全。这会在Android 26之前的版本上引起任何问题吗?有关此方面的更

  • 问题内容: 是否真的计算了PHP数组的所有元素,还是将此值缓存在某个地方并被获取? 问题答案: 好吧,我们可以看看源代码: call ,这反过来又需要非递归数组,该数组是通过以下方式实现的: 所以你可以看到,它的。