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

顺序后继法打印BST的时间复杂度

微生善
2023-03-14

我有一种在二元搜索树(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)。对吗?

共有1个答案

籍永安
2023-03-14

您可以通过总是在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循环。这个说法之后我就糊

  • 我的问题如下: 我有一个带关键字的二元搜索树: