在平衡的二叉搜索树中搜索

时间:2016-01-07 23:06:20

标签: data-structures binary-tree

我正在阅读有关平衡二叉搜索树的内容。我发现了关于在这样的树中搜索的声明:

  

当你在具有n个元素的平衡二元搜索树中寻找某些东西时,它可能在最坏的情况下需要进行n / 2次比较。

为什么不是这样?

是不是我们要么看向树的右侧还是左侧,所以比较应该是n / 2?

6 个答案:

答案 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)。