【问题标题】:Searching in a balanced binary search tree在平衡二叉搜索树中搜索
【发布时间】:2018-03-30 19:40:40
【问题描述】:

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

当您在具有 n 个元素的平衡二叉搜索树中查找某些内容时,在最坏的情况下可能需要 n/2 次比较,这是不正确的。

为什么不是真的?

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

【问题讨论】:

标签: data-structures binary-tree


【解决方案1】:

Balanced Binary Search tree 的搜索最坏情况由其高度决定。 O(height),高度为log2(n),因为它是平衡的。

在最坏的情况下,我们要查找的节点位于叶子中或根本不存在,因此我们需要从根到叶子遍历树,即 O(lgn) 而不是 O(n/2)

【讨论】:

  • 不是二叉搜索树右边的值比左边的大吗?谢谢
  • 在 BST 和平衡二叉搜索树中搜索有什么区别吗..谢谢
【解决方案2】:

考虑以下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,先验可能是正确,但不是很好/严格的!)

【讨论】:

  • 为什么在这个表中bigocheatsheet.com 它没有说大小为 n 的二叉搜索树的时间复杂度是 O(log2(n)) 但它说它是 O(log(n)) ...谢谢
  • 我引用en.wikipedia.org/wiki/Time_complexity#Logarithmic_time“由于计算机使用二进制数字系统,对数经常以2为底(即log2 n,有时写作lg n)。 ".由于我们使用的是 binary 树,2 通常被省略(但可以推断)。因此,在您的备忘单中,O(log(n))O(log2(n)) 相同。
  • @CarMar 很高兴为您提供帮助。请记住接受您认为最能回答问题的答案,并可能投票赞成您认为有帮助的所有答案:meta.stackexchange.com/questions/5234/…
  • 最后一个问题:在 BST 和平衡二叉搜索树中搜索有什么区别? ..谢谢
  • 可能是个傻瓜,我知道维基百科说的是不是你,但我认为说日志经常以 2 为基数是不正确的,因为计算机使用二进制文件。您的答案中描述的复杂性与计算机实现使用的数基无关。它是划分和搜索策略的属性。
【解决方案3】:

想象一下有 10 个节点的树:1,2,3,4,5..10。 如果您要寻找 5,需要进行多少次比较?如果你找10个怎么样? 实际上从来不是 N/2。

【讨论】:

  • 为什么在这个表中bigocheatsheet.com 它没有说大小为 n 的二叉搜索树的时间复杂度是 O(log2(n)) 但它说它是 O(log(n)) ...谢谢
  • 是一样的。就大 O 而言,所有对数都相同。
【解决方案4】:

最坏的情况是您要搜索的元素是叶子(或不包含在树中),然后比较的次数等于树的高度,即 log2(n)。

【讨论】:

    【解决方案5】:

    最佳平衡二叉树是 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

    【讨论】:

      【解决方案6】:

      让我们先看看 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)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-12-18
        • 1970-01-01
        • 1970-01-01
        • 2012-05-13
        • 1970-01-01
        • 2016-06-05
        相关资源
        最近更新 更多