闲扯B-Tree和B+Tree的异同

2017 年 6 月 4 日 SimpleMain 简单的老王

在聊今天的正题以前,老王还是要跟大家说一个事情:微信公众号有个限制,超过一段时间的消息不能回复。老王平时花在工作上的时间比较多,等有时间回复大家消息的时候,微信已经不允许了。所以,大家如果没有收到老王的回复,请到公众号右下角菜单「有点意思->有问有答」中提问哈。老王对大家的提问一定是有问有答的!

 

好了,话归正传,我们今天要聊一个比较硬的话题:一个传说中的惊天动地的牛逼的大家都听说过的却又很少实际深入接触到的但又基本每天都在使用的数据结构。(大家注意看上一句话的定语)

 

我记得我最先接触B树是在大学学数据结构的时候,那会儿有一章是专门讲B树的。但是那一章老师说是选学,所以不讲…… 我自己下来把那一章看了,看的有点云里雾里。后来学数据库原理,又提到了B+树,才去又好好的学习了一遍。

 

但是也是因为平时很少直接使用这个数据结构(比起数组、链表、Hash等等来讲),反反复复的看,反反复复的忘。在今天写这篇文章之前,老王又拿起了「算法导论」重新review了一遍。

 

##

 

B树和B+树其实都是平衡搜索树。这里要脑补一下平衡搜索树的概念:这个词划分一下就是平衡+搜索+树。也就是说,他首先是一棵树,其次能搜索,再次他是平衡的。大家耳熟能详的一个概念:二叉平衡搜索树。(详细的大家可以在百度上搜一下定义,或者拿起那本厚实的「算法导论」看看)。

 

##

 

但是B树和B+树却有不同的地方。就是这些不同的地方,决定了他们的用处可能不一样。

 


我画了一个不太漂亮的B树的图。我们可以看到B树里面,每个结点有这样的特点:不论是叶结点还是非叶结点,都含有Key和一个指向数据的指针。这样,一旦找到某个结点以后,就可以根据指针找到对应的磁盘地址。

 

但是,这也带来了另外的问题,就是每一个数据的指针会带来额外的内存占用,从而减少放入内存的结点数。

 


我们再回头看看B+树,他有两个明显的特征:

 

1、所有的叶子结点才有指向数据的指针。非叶结点就是纯的索引数据。这样的好处在于,我们可以将尽可能的非叶结点载入内存,没有浪费。

 

2、大家注意看那个红色的箭头,每个叶结点都有指向下一个叶结点的链接。这样的好处在于,我们可以从任意一个叶结点开始遍历,获取接下来所有的数据。

 

所以,综合来看,B+TreeB-Tree少了点儿东西,又多了点儿东西。这样就使得很多数据库在选择索引数据结构的时候,选择了B+Tree(也不是所有的)。

 

比如,我们写一条Sqlselect * from alphabets order by key_word;

 

大家想想,如果用B树和B+树,怎么样来实现这样的功能?B树好像比较为难。B+树则可以直接用叶结点的索引链遍历。

 

这样看起来,B+树似乎比B树强很多。但是,任何算法和数据结构都有适用他的地方。如果没有order by这样类似的需求,而B树实现的成本比B+树要低,那么采用B树也是一种不错的选择。所谓的没有最好,只有更适合。选择适合的最重要~

 

 


登录查看更多
0

相关内容

【2020新书】实战R语言4,323页pdf
专知会员服务
101+阅读 · 2020年7月1日
【实用书】学习用Python编写代码进行数据分析,103页pdf
专知会员服务
195+阅读 · 2020年6月29日
干净的数据:数据清洗入门与实践,204页pdf
专知会员服务
162+阅读 · 2020年5月14日
【实用书】流数据处理,Streaming Data,219页pdf
专知会员服务
77+阅读 · 2020年4月24日
【资源】100+本免费数据科学书
专知会员服务
108+阅读 · 2020年3月17日
【反馈循环自编码器】FEEDBACK RECURRENT AUTOENCODER
专知会员服务
23+阅读 · 2020年1月28日
亿级订单数据的访问与储存,怎么实现与优化
ImportNew
11+阅读 · 2019年4月22日
亿级订单数据的访问与存储,怎么实现与优化?
码农翻身
16+阅读 · 2019年4月17日
对梯度提升树GBDT最通俗的介绍
七月在线实验室
9+阅读 · 2018年7月16日
Python | 爬爬爬:爬百度云,爬百度贴吧,爬爱奇艺
计算机与网络安全
3+阅读 · 2018年3月30日
【 关关的刷题日记53】 Leetcode 100. Same Tree
专知
10+阅读 · 2017年12月1日
机器学习算法实践:决策树 (Decision Tree)
Python开发者
9+阅读 · 2017年7月17日
代码这样写不止于优雅(Python版)
数说工作室
4+阅读 · 2017年7月17日
TResNet: High Performance GPU-Dedicated Architecture
Arxiv
8+阅读 · 2020年3月30日
Two Stream 3D Semantic Scene Completion
Arxiv
4+阅读 · 2018年7月16日
Arxiv
6+阅读 · 2018年2月7日
Arxiv
8+阅读 · 2018年1月19日
VIP会员
相关VIP内容
【2020新书】实战R语言4,323页pdf
专知会员服务
101+阅读 · 2020年7月1日
【实用书】学习用Python编写代码进行数据分析,103页pdf
专知会员服务
195+阅读 · 2020年6月29日
干净的数据:数据清洗入门与实践,204页pdf
专知会员服务
162+阅读 · 2020年5月14日
【实用书】流数据处理,Streaming Data,219页pdf
专知会员服务
77+阅读 · 2020年4月24日
【资源】100+本免费数据科学书
专知会员服务
108+阅读 · 2020年3月17日
【反馈循环自编码器】FEEDBACK RECURRENT AUTOENCODER
专知会员服务
23+阅读 · 2020年1月28日
相关资讯
亿级订单数据的访问与储存,怎么实现与优化
ImportNew
11+阅读 · 2019年4月22日
亿级订单数据的访问与存储,怎么实现与优化?
码农翻身
16+阅读 · 2019年4月17日
对梯度提升树GBDT最通俗的介绍
七月在线实验室
9+阅读 · 2018年7月16日
Python | 爬爬爬:爬百度云,爬百度贴吧,爬爱奇艺
计算机与网络安全
3+阅读 · 2018年3月30日
【 关关的刷题日记53】 Leetcode 100. Same Tree
专知
10+阅读 · 2017年12月1日
机器学习算法实践:决策树 (Decision Tree)
Python开发者
9+阅读 · 2017年7月17日
代码这样写不止于优雅(Python版)
数说工作室
4+阅读 · 2017年7月17日
相关论文
Top
微信扫码咨询专知VIP会员