【发布时间】:2017-10-25 02:24:48
【问题描述】:
【问题讨论】:
标签: performance binary-search-tree computer-science
【问题讨论】:
标签: performance binary-search-tree computer-science
在 O 表示法中,常数无关紧要。例如,log2(n) 和 log10(n) 仅相差一个常数,这就是为什么在 O 表示法中只显示 log(n)
【讨论】:
Roman Cortes 在另一个答案中说对了:渐近复杂度无关紧要,因为当 a 和 b 是大于一的整数时,很容易证明 log_a(n) = Theta(log_b(n))。
但是,我认为首先考虑 log 的来源仍然具有启发性 - 肯定有一些与它的动机相关的数字,并且理解可以帮助您首先得出这些界限。
二叉搜索树的构造是为了快速搜索值。所有节点最多有两个子树,其中左子树中的所有值都小于父节点的值,右子树中的所有值都大于父节点的值。当你搜索一个平衡的二叉搜索树时(重要的是它是平衡的!),你有效地减半(或接近减半)剩余的节点数,以搜索目标值。我们可以使用运行时递归关系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(log_2(n)) = O(log n)。
假设我们有一个平衡的三叉树,其中值是范围,并且适用以下规则:
所以,这可能是一个平衡的三叉搜索树:
(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)。
【讨论】: