B+树检索的时间复杂度

https://zhuanlan.zhihu.com/p/110202102

前几天面了头条深圳的暑期实习,在一面中和面试官讨论到了这样一个问题:

面试官抛出了一个很经典的考题:许多数据库为什么使用B+树作为索引结构,有什么好处?

我想当然地觉得B+树就是个平衡二叉查找树的升级版,既然后者的时间查询复杂度为 [公式] ,那B+树作为m叉树,自然就是 [公式]咯?

面试官:不对不对,你想想,虽然你可以认为一共只有log(m)n层,但是你每一层平均都要遍历m/2个节点才能确定往下面哪一个分支走呀,这和二叉树的O(1)判断走哪个分支可不一样,我记得最终算出来的复杂度是log n,blabla(很快我们就自觉避开了这个一看就很复杂的复杂度推导)

我:有道理诶。。于是面试完后到牛客发帖求助,很快,有一位牛油给了我这样一个参考思路,这里表示感谢:

层数log(m)n,每一层平均m/2,所以一共是(m/2) * log(m)n,由于m是常数,所以复杂度O(log n),即以2为底n的对数

这已经是个很详细的推导了,但是最后一步怎么变成log n的我总是想不明白

我觉得这个答案是不准确的,我自己再推了一遍:

首先前面的步骤略,得到复杂度为(m/2) * log(m)n,这里系数1/2不影响复杂度可以直接略掉,但是m是同时存在于系数和底数里的,不应该省略,也很容易看出,m的取值对复杂度是有影响的。那么m该取多少?这个复杂度平均情况下的界是多少?

对mlog(m)n,可以把m放到底数中去,也就是log(m的1/m次方)n。(这里利用了一条性质,系数m放到底数中时,相当于底数开m次方,可以用换底公式证明)

容易证明,当m->1时,m的1/m次方->1;当m->正无穷时,m的1/m次方->1,也就是底数的值并不是m的单调函数,而更接近于一个两头小中间大的图象。

可以证明,当m取3时,底数取最大值,复杂度取最小值,此时底数约为三次根号3,约等于1.44,而log(1.44)n > log n,因此log n并不是上界。

(证明:对n的1/n次方取对数,求导,易得单调区间和最值)

结论:理论上,B+树的查找时间复杂度为 log1.44(n)

为什么是理论上?因为我总觉得没那么简单。事实上,数据库查找占大头的是磁盘I/O,当我们读取同一层的几个相邻节点时,它们很可能处于同一个磁盘块中,我们只需要一次磁盘I/O就可以取到,而往下遍历时,往往需要取别的磁盘块(未经文献查证,纯属个人猜测)。也就是说,层数和每层节点的个数这两个因素,它们可能是不等权的。实际设计中很可能要考虑更多的因素。

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值