繁体   English   中英

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

[英]Why is add in unbalanced Binary Search Tree O(n)?

这是BST Add中Binary Search Tree中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;
    }

我知道为什么它在O(log n)中运行。 这就是我的分析方式。 我们的树大小为n。 多少个2的切口或半切口将把这棵树缩小到1的大小。因此,我们有n(1/2)^ x = 1的表达式,其中1/2表示每个半切口。 为x解决这个问题,我们有log2(x),所以logn来自搜索。
这是Heap的演讲幻灯片,讨论了不平衡二进制搜索的运行时。 在此处输入图片说明

我的问题是,即使二进制搜索树不平衡,使用相同的策略来分析添加的运行时间也行不通吗? 您必须进行多少次切割。 运行时是否仍为O(log n),而不是O(n)? 如果是这样,有人可以说明为什么它是O(n)的数学方法吗?

对于不平衡的树:

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

您每次操作将树切成两半的直觉不再适用。 该不平衡树是不平衡二进制搜索树的最坏情况。 要在列表底部搜索10 ,必须执行10操作,每个操作针对树中的每个元素。 这就是为什么不平衡的二进制搜索树的搜索操作为O (n)的原因-该不平衡的二进制搜索树等效于链接列表。 每个操作都不会砍掉一半的树-只是您已经访问过的一个节点。

这就是为什么二进制搜索树(例如红黑树和AVL树)的特殊版本很重要的原因:它们维护的树要平衡得足够好,以便所有操作(搜索,插入,删除)仍为O (log n)。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM