[英]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.