我有一种在二元搜索树(BST)中查找下一个顺序后续项的方法。“inorderSuccessor”方法将BST的任何节点作为输入,并输出下一个inorder后续节点。方法和树类定义如下:
class BSTInorderSuccessor{
public static Node inorderSuccessor(Node node) {
if (node.right != null) {
return minValue(node.right);
}
Node parent = node.parent;
while (parent != null && node == parent.right){
node = parent;
parent = parent.parent;
}
return parent;
}
}
class TreeNode{
int data;
Node left;
Node right;
Node parent;
public TreeNode(int data){
this.data = data;
this.left = null;
this.right = null;
this.parent = null;
}
}
假设BST的高度为h,并且此树结构中有n个节点。我知道“inorderSuccessor”方法的时间复杂度是O(h)。
我的问题是:给定BST的最小节点。当我编写一个方法来连续调用“inorderSuccessor”来打印BST的所有节点时,总时间复杂度是多少?我想是O(n*h)。对吗?
您可以通过总是在O(nh)处找到有序的继承者来限制打印所有内容的成本,但这实际上并不是一个严格的限制。您可以显示运行时实际上是Θ(n),与树的高度无关!
一种方法是查看树中每条边的访问次数。如果您追踪所有这些按序遍历的执行情况,您会发现每条边只向下走一次,每条边只向上走一次,完成的总工作量与每条边的访问次数成正比。n节点树中的边数为Θ(n),因此是运行时界限。
请注意,您不能说每个单独的操作都需要时间O(1)。这不是真的。您可以说的是,总的来说,每个操作平均需要O(1)时间。
给定一个高度为h的二叉查找树(BST),它需要O(k h)时间来连续应用BST Inorder后续算法k次,从任何节点开始,在先前调用返回的节点上应用每个下一个调用。 伪代码: 我如何证明这种时间复杂性? 特别是,我试图建立k和访问的节点数之间的关系,但在这里找不到任何模式。
假设T是具有n个节点和高度h的二叉查找树。T的每个节点x存储一个实数x。键。给出以下算法Func1(T. root)的最坏情况时间复杂度。你需要证明你的答案。 x.left() 对于最坏情况下的运行时,我认为这将是O(树的高度),因为这基本上类似于最小()或最大()二元搜索树算法。然而,它是递归的,所以我对是否将O(h)作为最坏的运行时编写有点犹豫。 当我考虑它时,最坏的情况是如果函数执行if(s
我很难找出平均和最坏情况下的时间复杂度。因此,我使用以下逻辑删除了BST节点 删除二元搜索树中的节点时,有3种情况 那么,如何计算总体平均时间复杂度和最差时间复杂度??
问题内容: 我想在主要评论之后显示最新评论及其回复。显然,答复将具有最新日期,因此我无法按日期对日期进行排序,因为答复将位于主要日期之上。我不确定如何通过一个查询正确执行此操作。任何想法都可以。 数据库转储:http : //pastie.org/576963 问题答案: 我猜文章的“回复ID”为0,评论的文章号为。如果这是您的设计,这应该可以工作: 添加: 感谢您在评论中提供其他信息。将结果按所
今天,我和我的同事就一个特定的代码片段发生了一个小争论。代码看起来像这样。至少,这是他想象的那样。 他希望我删除第二个循环,因为这会导致性能问题。 然而,我确信,因为我在这里没有任何嵌套循环,所以无论我放了多少个顺序循环(我们只有2个),复杂度总是O(n)。 他的论点是,如果< code>n是1,000,000,并且循环需要5秒,那么我的代码将需要10秒,因为它有2个for循环。这个说法之后我就糊
我对在二进制搜索树中前进和后退的最坏情况效率感兴趣。 不平衡树: 看起来最坏的情况是4- 平衡树: 最坏情况是2- 我认为BST的最坏情况是O(高度-1),对于平衡树是O(log n),对于不平衡树是O(n-1),这是对的吗?