Performance 在二进制搜索树中,大O的日志的基础是什么

Performance 在二进制搜索树中,大O的日志的基础是什么,performance,binary-search-tree,computer-science,Performance,Binary Search Tree,Computer Science,当讨论此表中的平均时间复杂度时 O(对数n) 我假设它是2,但我想验证一下。这些数据结构是否总是2 在O表示法中,常数并不重要。例如,log2(n)和log10(n)只相差一个常数,这就是为什么在O表示法中只显示log(n)Roman Cortes在另一个答案中得到了正确答案:这与渐近复杂性无关,因为很容易显示log_a(n)=θ(log_b(n))当a和b是大于1的整数时 但是,我认为,首先考虑“日志>代码>是从哪里来的还是有启发性的。当然,有一些与它的动机相关联的数字,并且理解可以帮助你首先

当讨论此表中的平均时间复杂度时

O(对数n)

我假设它是2,但我想验证一下。这些数据结构是否总是2


在O表示法中,常数并不重要。例如,log2(n)和log10(n)只相差一个常数,这就是为什么在O表示法中只显示log(n)

Roman Cortes在另一个答案中得到了正确答案:这与渐近复杂性无关,因为很容易显示
log_a(n)=θ(log_b(n))
a
b
是大于1的整数时

<>但是,我认为,首先考虑“<代码>日志>代码>是从哪里来的还是有启发性的。当然,有一些与它的动机相关联的数字,并且理解可以帮助你首先获得这些界限。

二叉搜索树的构造使其能够快速搜索值。所有节点最多有两个子树,其中左子树中的所有值都小于父节点上的值,而右子树中的所有值都大于父节点上的值。当您搜索一个平衡的二叉搜索树时(平衡是很重要的!),您实际上将要搜索目标值的剩余节点数减半(或接近减半)。我们可以使用运行时递归关系
T(n)=T(n/2)+c
来表示这一点。上面说:

平衡二叉搜索树中搜索操作的运行时间由一个常数项给出,该常数项来自将目标与当前节点的值(
c
)进行比较,加上搜索左子树或右子树的时间,但不能同时搜索这两个子树(
T(n/2)

合理地假设
T(0)=a
对于某个常数
a
,我们可以写出
T
的几个值:

n    T(n)
-    ----
0    a
1    T(1/2) + c = a + c
2    T(2/2) + c = a + c + c = a + 2c
4    T(4/2) + c = a + 2c + c = a + 3c
8    T(8/2) + c = a + 3c + c = a + 4c
...
2^k  T(2^k/2) + c = a + kc + c = a + (k+1)c
k=log_2(n)
。然后我们得到
T(n)=T(2^k)=a+(k+1)c=a+(1+log_2(n))c
。因此,
T(n)=O(logu 2(n))=O(logn)

假设我们有一个平衡的三叉树,其中的值是范围,并应用以下规则:

  • 如果目标的下限小于当前节点的下限,则目标位于左子树中
  • 如果目标的上限大于当前节点的上限,则目标位于右子树中
  • < LI>否则目标在中间子树中。 因此,这可能是一个平衡的三元搜索树:

              (10,20)
                 |
      +----------+----------+
      |          |          |
    (5,11)    (11,15)    (21,24)
                            |
                         (22,23)
    

    搜索可能与二进制搜索一样工作,除非您检查两个条件而不是一个条件,并从三个可能的子树中选择一个,而不是从两个可能的子树中选择一个。递归关系变为
    T(n)=T(n/3)+c'
    ,解决方案最终是
    T(n)=a'+(1+log_3(n))c'=O(log_3(n))=O(log n)

    我知道常数并不重要,但我不确定它是否会被视为常数。我得到5个对数(n)和10个对数(n)。你是说2^n和8^n也会有相同的大O吗?他们没有在我发布的链接中遗漏2^n中的2。你看到关系了吗?只有一个例子:log2(n)=log10(n)*3.3219。。。(长数字)。试着用任意n,你会发现这是真的,这不是我在编的,这只是对数的一个性质,如果2^n和8^n相同,不,它们之间没有常数的差异