为什么二进制搜索的big-O中的日志不是以2为底的?


35

我是了解计算机科学算法的新手。我了解二进制搜索的过程,但是我对其效率有些误解。

在元素的大小中,平均需要步骤才能找到特定元素。取双方的底数为2的对数,得出。那么二分查找算法的平均步数不是吗? n log 2s = n log 2s s=2nnlog2(s)=nlog2(s)

维基百科有关二进制搜索算法的文章说,平均性能为。为什么会这样呢?为什么这个数字不是?log 2n O(logn)log2(n)


Answers:


86

当您更改对数的底数时,结果表达式仅相差一个常数,根据Big-O表示法定义,这意味着两个函数的渐近行为都属于同一类。

例如 其中 。C=1

log10n=log2nlog210=Clog2n
C=1log210

因此和相差一个常数,因此两者都是正确的: 通常,对于大于1的正整数和是。log10nlog2nC

log10n is O(log2n)
log2n is O(log10n)
loganO(logbn)ab

对数函数的另一个有趣的事实是,对于常数,不是,但是是因为,其不同于仅通过常数因子。n k O n log n k O log nlog n k = k log n log n kk>1nkO(n)lognkO(logn)lognk=klognlognk


不仅对于正整数:对于所有实数,例如。ea,b>1e
nbubis

2
我要补充一点,这就是为什么使用big-O表示法通常不指定对数的底数的原因。这也意味着不会混淆使用哪个基数:它可以是任何常用的基数,因为它没有区别。O(logn)
svick '17

9

除了fade2black的答案(这是完全正确的)之外,值得注意的是,符号“ ”是不明确的。实际未指定基准,默认基准根据上下文而变化。在纯数学中,几乎总是假定基数为(除非指定),而在某些工程环境中,基数可能为10。在计算机科学中,基数2无处不在,因此通常假定为基数2。文章从不对基础发表任何评论。e 日志log(n)elog

但是,正如已经显示的那样,在这种情况下它并不重要。


7
也许还值得一提的是,尽管“ log(n)”可能不明确,但“ O(log(n))”并不是因为后者只有一个含义,无论您考虑的是什么基础。
克里斯(Chris)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.