我正在阅读有关平衡二叉搜索树的内容。我发现了关于在这样的树中搜索的声明:
当你在具有n个元素的平衡二元搜索树中寻找某些东西时,它可能在最坏的情况下需要进行n / 2次比较。
为什么不是这样?
是不是我们要么看向树的右侧还是左侧,所以比较应该是n / 2?
答案 0 :(得分:1)
Balanced Binary Search tree
的搜索最坏情况由其高度决定。它是 O(高度),其高度为log2(n)
,因为它是平衡的。
在最坏的情况下,我们寻找的节点位于一个叶子中或根本不存在,因此我们需要遍历树从根到其叶子 O(lgn) 而非 O(n / 2)
答案 1 :(得分:0)
想象一下有10个节点的树:1,2,3,4,5..10。 如果您正在寻找5,需要进行多少次比较?如果你寻找10怎么样? 它实际上从来不是N / 2.
答案 2 :(得分:0)
最糟糕的情况是你要搜索的元素是一个叶子(或者不包含在树中),然后比较的数量等于树高度log2(n)。
答案 3 :(得分:0)
考虑n=7
的以下平衡二叉树(这实际上是一个完整的二叉搜索树,但让我们不参考此讨论,因为完整的二叉搜索树也是一个平衡的二叉搜索树)。
5 depth 1 (root)
/----+----\
2 6 depth 2
/--+--\ /--+--\
1 3 4 7 depth 3
为了搜索此树中的任何数字,最坏的情况是我们达到树的最大深度(例如,在这种情况下为3),直到我们终止搜索。在深度3处,我们进行了3次比较,因此,在任意深度l
,我们将进行l
次比较。
现在,对于一个完整的二元搜索树,如上所述,任意大小,我们可以保持1 + 2^(maxDepth-1)
个不同的数字。现在,我们假设我们有一个完整的二叉搜索树,其中包含n
个(不同的)数字。然后以下是
n = 1 + 2^(maxDepth-1) (+)
因此
(+) <=> 2^(maxDepth-1) = n - 1
<=> log2(2^(maxDepth - 1)) = log2(n - 1)
<=> maxDepth - 1 = log2(n - 1)
=> maxDepth = log2(n - 1) + 1
回想一下,maxDepth
告诉我们最坏情况下的比较数,以便我们在完整的二叉树中找到一个数字(或者它不存在)。因此
worst case scenario, n nodes : log2(n-1) + 1
为了研究此搜索的渐近或限制行为,n
可被视为足够大,因此log2(n) ~= log2(n-1)
成立,随后,我们可以说算法的一个相当好的(紧的)上界是O(log2(n))
。因此
在完整的二叉树中搜索的时间复杂度, 对于
n
个节点,O(log2(n))
对于非完整的二分查找树,如上所述的类似推理导致相同的时间复杂度。请注意,对于非平衡搜索树,n
节点的最差情况是n
比较。
答案:从上面可以清楚地看出O(n/2)
不是大小为n
的二叉搜索树的时间复杂度的正确界限;然而,O(log2(n))
是。 (注意,先验可能是正确的绑定到足够大的n
,但不是非常好/紧的!)
答案 4 :(得分:0)
最佳平衡二叉树是AVL树。我说“最好的”是因为他们的修改操作是O(log(n))。如果树完全平衡,那么它的高度仍然较低(但是在O(log(n))中修改它是不可知的。
可以看出AVL树的最大高度小于
1.4404 log(n + 2) - 0.3277
因此,在AVL树中搜索的最坏情况是不成功的搜索,其来自根的路径在最深节点处结束。但是根据之前的结果,这条路径不能超过1.4404 log(n + 2) - 0.3277。
并且自1.4404 log(n + 2) - 0.3277&lt; n / 2,该陈述是假的(假设n足够大)
答案 5 :(得分:0)
让我们首先看到BST(二叉搜索树)属性,它告诉了..
-- root must be > then left_child
-- root must be < right child
10
/ \
8 12
/ \ / \
5 9 11 15
/ \ / \
1 7 14 25
给定树的高度为3(最长路径10-14中的边数)。
假设您在给定的平衡BST中查询搜索14
node-- 10 14 > 10
/ \ go to right sub tree because all nodes
8 12 in right sub tree are > 10
/ \ / \
5 9 11 15 n = 11 total node
/ \ / \
1 7 14 25
node-- 12 14 > 12
/ \ again go to right sub tree..
11 15
/ \ n = 5
14 25
node-- 15 14 > 15
/ \ this time node value is > required value so
14 25 goto left sub tree
n = 3
'node -- 14 14 == 14 value find
n = 1'
从上面的例子中我们可以看到,在问题的每个比较大小(节点数)减半时,我们也可以说在每次比较时我们都切换到下一级,因此树的高度增加了1。
因为平衡BST的最大高度是log(N),在最坏的情况下我们需要去树的叶子因此我们采取log(N)步骤这样做。
因此,BST搜索的O是log(N)。