为什么查找在二叉搜索树是O(日志(n))的?(Why lookup in a Binary Sear

2019-08-07 13:48发布

我可以看到,在BST查找一个值,当我们离开树每次半,我们比较我们正在寻找的值的节点。

但是我不明白为什么时间复杂度为O(log(n)) 所以,我的问题是:

如果我们有N个元素的树,为什么找了树和检查,如果一个特定的值存在的时间复杂度为O(日志(N)),我们如何得到呢?

Answer 1:

你的问题似乎得到了很好回答这里 ,而是在总结有关您的具体问题,它可能是更好的反想起来; “会发生什么情况BST解决时间节点数量上升”?

从本质上讲,在BST每次加倍节点的数量,您只加一的步数来解决。 为了扩展这个,四倍的节点给出了两个额外的步骤。 八倍节点给出了三个额外的步骤。 十六倍的节点给出四个额外的步骤。 等等。

基部2日志中这些对所述第一数目的是在这些对所述第二数量。 这是基地2日志,因为这是一个二进制搜索(你一半问题空间中的每一步)。



Answer 2:

对我来说,最简单的方法是看的log 2(n)的图,其中n是二叉树结点的数量。 作为一个表,这看起来像:

          log2(n) = d

          log2(1) = 0
          log2(2) = 1 
          log2(4) = 2
          log2(8) = 3
          log2(16)= 4 
          log2(32)= 5
          log2(64)= 6             

然后我画有点二叉树,这一个从深度d变为= 0至d = 3:

            d=0          O
                        / \
            d=1        R   B
                      /\   /\
            d=2      R  B R  B
                    /\ /\ /\ /\
            d=3    R B RB RB R B

从而节点当深度d从d变为数n,在树有效地加倍 (例如正由8随着从7至15的增加(这几乎是加倍)= 2〜d = 3,通过增加1。)因此,需要所需的处理的附加量(或时间)仅为1额外的计算(或迭代)增加时,因为处理的量与d。

我们可以看到,我们走下来只有1个深度d的附加级别,从d = 2 d = 3,找到我们想要的所有节点的n个节点,加倍节点的数量之后。 因为我们现在已经搜查了整棵树这是真实的,那么,我们需要搜索找到我们想要的节点它的一半。

我们可以写为d = log2(n)其中d告诉我们,大量的计算,我们需要(多少次迭代)做(平均)如何到达树中的任何节点,当有树n个节点。



Answer 3:

这可以在数学上表现得非常轻松。

我目前在此之前,让我澄清一些东西。 查找找到一个平衡二叉搜索树的复杂性或者是O(日志(N))。 对于一般的二叉搜索树,它是O(n)。 下面我将同时显示。

在一个平衡的二叉搜索树,在最坏的情况下,我正在寻找的值是树的叶子。 我基本上是从根遍历到叶,通过查看树只有一次 - 由于BSTS的有序结构的每一层。 因此,我需要做的搜索次数是树的层数。 因此,问题归结为寻找一个封闭形式的表达式,为具有n个节点的树的层的数量。

这是我们会做一个简单的归纳。 仅具有1层A树仅具有1个节点。 的2层A树具有1个+ 2节点。 3层1 + 2 + 4个节点等的图案是清楚的:具有k层A树具有完全相同

N = 2 ^ 0 + 2 ^ 1 + ... + 2 ^ {K-1}

节点。 这是一个几何级数,这意味着

N = 2 ^ k-1个,

等效:

K =的log(n + 1)

我们知道,大哦,有兴趣的n值很大,因此常数是无关紧要的。 因此,O(日志(n))的复杂性。

我给另一-much shorter-方式来显示同样的结果。 由于同时寻找一个值,我们不断地分裂树为两半,我们不得不这样做k次,其中k为层数,以下是正确的:

(N + 1)/ 2 ^ k = 1时,

这意味着完全相同的结果。 你必须说服自己关于其中n是+1 + 1是从哪里来的,但即使你不关注它,因为我们正在谈论的n值很大它是好的。

现在让我们来讨论通用二叉搜索树。 在最坏的情况下,这是完全不平衡的,这意味着所有的节点只有一个孩子(和它成为一个链表)查看例如https://www.cs.auckland.ac.nz/~jmor159/PLDS210/niemann/ s_fig33.gif

在这种情况下,要找到在叶的价值,我需要遍历所有节点上,因此为O(n)。

最后需要说明的是,这些复杂持有发现不仅如此,而且还插入和删除操作。

(当我达到10代表处点我将修改我的方程更好看的乳胶数学造型,所以不会让我现在。)



Answer 4:

每当你看到有一个O运行时(log n)的因素在里面, 有你要找的形式的东西非常好的机会,“保持一个常数除以某个对象的大小。” 所以,可能是考虑这个问题的最好办法就是 - 因为你在一个二叉搜索树做的查找,到底是什么那是越来越常数因子减少,并且是恒定的到底是什么?

首先,让我们想象一下,你有一个完美的平衡二叉树,一些看起来是这样的:

                     *
              /             \
             *               *
          /     \         /     \
         *       *       *       *
        / \     / \     / \     / \
       *   *   *   *   *   *   *   *

在做搜索的每个点,你看看现在的节点。 如果这是你要找的,伟大的人! 你完全完成。 在另一方面,如果它不是,那么你要么陷入左子树或右子树,然后重复这个过程。

如果你走进两个子树的一个,你基本上说:“我完全不关心什么是在其他的子树。” 你把自己所有的节点在它拿走。 有多少节点都是在那里呢? 好了,有了一个快速的目视检查 - 最好是一个跟进一些不错的数学 - 你会看到,你折腾了大约一半的树中的节点。

这意味着,在查找的每一步,你要么(1)找到你要找的,或(2)折腾了树一半节点的节点。 既然你在每一步做的工作一定量,你看在澳的标志行为(log n)的行为 - 的工作由一个常数因子在每一步下降,所以它只能做这么多对数倍。

现在当然,并不是所有的树木看起来是这样。 AVL树有,每次向下降落到一个子树时,你扔掉大约占总节点黄金比例部分的乐趣属性。 因此,这可以保证你用完节点之前,你只能用对数很多步骤 - 因此,O(log n)的高度。 在红/黑树,每一步都扔掉(大概)一个总节点的四分之一,因为你常数因子萎缩,你又得到了O(log n)的查找时间你想。 非常有趣的替罪羊树有用来决定是多么紧密地平衡可调谐参数,但你可以再次证明,每次你走一步扔掉基于此可调参数的一些常数因子,使O(log n)的查找。

然而,这种分析分解为不平衡树。 如果你有一个纯粹的堕落树 - 一个,每一个节点都只有一个孩子 - 然后每一步下来,你只需要扔走一个节点,而不是一个固定比例的树。 这意味着,查找时间起床为O(n)在最坏的情况下,由于的次数,你可以减去从n个常数为O(n)。



文章来源: Why lookup in a Binary Search Tree is O(log(n))?