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

为什么在不平衡的二叉搜索树中添加O(n)?

商开济
2023-03-14

这是BST Add中二进制搜索树中add的实现

private IntTreeNode add(IntTreeNode root, int value) {
        if (root == null) {
            root = new IntTreeNode(value);
        } else if (value <= root.data) {
            root.left = add(root.left, value);
        } else {
            root.right = add(root.right, value);
        }

        return root;
    }

我的问题是,即使二元搜索树是不平衡的,同样的策略是否也能用于分析add的运行时?你要做多少次切割。运行时不是仍然是O(logn),而不是O(n)吗?如果是这样的话,有人能证明为什么它会是O(n)吗?

共有2个答案

白云
2023-03-14

BST中的< code>O(n)情况发生在顶部有最小值或最大值时,实际上将BST变成了一个链表。假设您将元素添加为:< code>1,2,3,4,5,生成BST,由于每个元素只有一个< code>right子元素,所以它将是一个链表。添加6必须在每个节点上向下,通过所有元素,因此使得add O(n)的渐近复杂度

司徒瀚
2023-03-14

对于不平衡的树:

1
 \
  2
   \
    3
     \
      4
       \
        5
         \
          ...

你的直觉是每次操作都要把树砍成两半,这已经不适用了。这种不平衡树是不平衡二叉搜索树的最坏情况。要在列表底部搜索10,您必须对树中的每个元素执行10操作。这就是为什么非平衡二叉搜索树的搜索操作是O(n)-这个非平衡二元搜索树等价于链表。每一次操作都不会砍掉树的一半——只会砍掉您已经访问过的一个节点。

这就是为什么特殊版本的二分搜索法树,如红黑树和AVL树很重要:它们保持树的平衡,使得所有的操作——搜索、插入、删除——仍然是O(log n)。

 类似资料:
  • 在上一节中,我们考虑构建一个二叉搜索树。正如我们所学到的,二叉搜索树的性能可以降级到 $$O(n)$$ 的操作,如 get 和 put ,如果树变得不平衡。在本节中,我们将讨论一种特殊类型的二叉搜索树,它自动确保树始终保持平衡。这棵树被称为 AVL树,以其发明人命名:G.M. Adelson-Velskii 和E.M.Landis。 AVL树实现 Map 抽象数据类型就像一个常规的二叉搜索树,唯一

  • 如果我有一个平衡的二叉树,并且我想在其中搜索一个项目,那么大的oh时间复杂度会是O(n)吗?在二叉树中搜索一个项目,不管它是否平衡,会改变O(n)的大时间复杂性吗?我知道如果我们有一个平衡的BST,那么搜索一个项目就等于BST的高度so O(log n),但是普通的二叉树呢?

  • 在我们继续之前,我们来看看执行这个新的平衡因子要求的结果。我们的主张是,通过确保树总是具有 -1,0或1 的平衡因子,我们可以获得更好的操作性能的关键操作。 让我们开始思考这种平衡条件如何改变最坏情况的树。有两种可能性,一个左重树和一个右重树。 如果我们考虑高度0,1,2和3的树,Figure 2 展示了在新规则下可能的最不平衡的左重树。 Figure 2 看树中节点的总数,我们看到对于高度为0的

  • 我刚刚学习了如何创建二进制搜索数据结构,它将用于存储字典中的数千个单词。我遇到的问题是,统计添加和删除数据需要很长时间。通常为199263毫秒或200秒,计算100000个单词。有人告诉我,拥有一棵能够自我平衡的树将提高效率,使操作更快。 我的问题是如何使我的树自动平衡以使其高效。我通过消除重复的单词来使树的高度变短,从而做了一些小小的改进。 如果有人能给我一些建议,告诉我如何使树高效,以及如何在

  • 所以,我一直在研究平衡的二叉查找树。 我谷歌了一下,这是我的发现: 二叉树,其中每个节点的两个子树的深度相差 1 或更小(来自维基百科) 难道就不能把平衡二叉树定义为高度不超过ceil(log(n ^ 1)/log ^ 2)的树吗? 从这个答案来看,提问者似乎已经问了同样的事情,但是公认的答案通过举斐波纳契树的例子拒绝了这个想法。斐波纳契树不是平衡树,对吗?我认为回答者可能会与AVL树中平衡树的定

  • 我目前正在编写一个递归方法,以返回整个二元搜索树上的最大不平衡。我对递归编程非常陌生,所以很难理解。我构建的树的不平衡度为1,但我的方法只返回0。我相信我的逻辑是有缺陷的。 我百分之百确定它正在运行“(root==null){返回0;}”在方法的每个步骤中。我尝试删除它并进一步定义它,它仍在继续这样做。 这是我当前的方法: