B树是为磁盘或其他直接存取的辅助存储设备而设计的一种平衡搜索树。B树类似于红黑树,但它们在降低磁盘I/O操场数方面要更好一些。许多数据库系统使用B树或B树的变种来存储信息。

介绍

常见的动态查找树包括:二叉查找树,平衡二叉查找树,红黑树,B tree、B+tree、B*tree。前三者是典型的二次查找树结构,其查找效率为O(lgN),与树的深度相关,那么降低树的深度自然会提高查找效率。

B树和红黑树的不同之处在于B树的节点可以有很多孩子,从数个到数千个。B树类似于红黑树,就是每颗含有n个节点的B树高度为O(lgn)。然而,一颗B树的严格高度可能比一颗红黑树的高度要小许多,这是因为它的分支因子,也就是表示高度的对数的底数可以非常大。因此,我们也可以使用B树在时间O(lgn)内完成一些动态集合的操作。

B树

用阶定义的B树

B树又叫平衡多路查找树,一个m阶的B树的特性如下:

  • 树中的每个结点最多有m个孩子
  • 除根和叶子节点外,其他节点至少有[ceil(m/2)]个孩子。ceil(x)是取上限的函数
  • 若根节点不是叶子节点,则至少有两个孩子。(特殊情况,没有孩子的根节点,即根节点为叶子节点,整棵树只有一个根节点)
  • 所有叶子节点都出现在同一层,叶子节点不包含任何关键字信息。 实际上,这些节点不存在,指向这些节点的指针都为NULL
  • 每个非终节点包含n个关键字信息(n, P0, K1, P1, K2,..., Pn-1, Kn, Pn),其中:
    • Ki(i = 1,2,...,n)为关键字,且关键字按顺序升序排列Ki-1 < Ki
    • Pi指向子树根节点,其中Pi-1指向的子树中的所有节点关键字都小于Ki,但都大于Ki-1
    • 关键字个数n必须满足[ceil(m/2) - 1] <= n <= m - 1

B树的类型和节点定义

#define m 1024
struct BTNode;
typedef struct BTNode *pBTNode;
struct BTNode{
int keyNum; //关键字个数,keyNum < m
pBTNode parent; //指向父节点
pBTNode *ptr; //子树指针向量ptr[0],ptr[1],...,ptr[keyNum]
keyType *key; //关键字向量,key[0], key[1],...,key[keyNum - 1]
};
typedef struct BTNode *BTree;

B树的高度

B树上的大部分的操作所需的磁盘存取次数与B树的高度是成正比的。

当B树中包含N个关键字时,B树的最大高度为h.(因为计算B树的高度是,叶节点所在层不计算在内): h = log(ceil(m/2))((N+1)/2) + 1

B+

B+树与B树的异同

一棵m阶的B+树和m阶的B树的异同点在于:

  • 有n棵子树的节点中含有n-1个关键字
  • 所有的叶子节点中包含了全部的关键字信息及指向含有这些关键字记录的指针,且叶子节点本身依照关键字的大小顺序链接(而B树中叶子节点不包含任何关键字信息)。
  • 所有的非终节点可以看作是索引部分,节点中仅含有其子树根节点中最大或最小关键字。(而B树中的非终节点也包含需要查找的有效信息)。

B+树应用

为什么说B+树比B树更适合实际应用中操作系统的文件索引和数据库索引?

  1. B+树的磁盘读写代价更低
  2. B+树的查询效率更稳定

数据库索引采用B+树的主要原因是B树在提高了磁盘I/O性能的同时并没有解决元素遍历的效率低下问题。正是为了解决这个问题,B+树应运而生。B+树只要遍历叶子节点就可以实现整棵树的遍历,而且在数据库中基于范围的查询是非常频繁的,而B树不支持这样的操作(或者说效率太低)。

B*

定义

B* 树是B+树的变体,在B+树的基础上(所有叶子节点包含全部关键字信息,及指向含有这些关键字记录的指针)。B *树中的非根和非叶子节点再增加指向兄弟的指针。B *树定义了非叶子节点关键字的个数至少为(2/3) * M,即块的最低使用率的2/3(代替B+树的1/2)

B+树的分裂

当一个节点满时,分配一个新的节点,并将原节点中的1/2复制到新节点,最后在新节点中增加指向新节点的指针;B+树的分裂只影响原节点和父节点,而不会影响兄弟节点,所以它不需要指向兄弟节点的指针

B*树的分裂

当一个节点满时,如果它的下一个兄弟节点未满,那么将一部分数据移到兄弟节点中,再在原节点上插入关键字,最后修改父节点中兄弟节点的关键字(因为兄弟节点的关键字范围改变了);如果兄弟节点也满了,则在原节点与兄弟节点之间增加新节点,并各复制1/3的数据到新节点,最后在父节点中增加新节点的指针。所以,B*树分配新节点的概率比B+树低,空间使用率更高。

参考

  1. 从B树、B+树、B*树谈到R 树
  2. 《算法导论》

B树及其变种的更多相关文章

  1. R树空间索引及其变种

    1.R树及其变种:百度百科 2.R树详介:http://blog.csdn.net/jazywoo123/article/details/7792745 3.R树及变种小结 R树:叶子节点或中间节点都 ...

  2. B树——算法导论(25)

    B树 1. 简介 在之前我们学习了红黑树,今天再学习一种树--B树.它与红黑树有许多类似的地方,比如都是平衡搜索树,但它们在功能和结构上却有较大的差别. 从功能上看,B树是为磁盘或其他存储设备设计的, ...

  3. Java数据结构——字典树TRIE

    又称单词查找树,Trie树,是一种树形结构,是一种哈希树的变种. 典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计. 它的优点是:利用字符串的公共 ...

  4. trie字典树详解及应用

    原文链接    http://www.cnblogs.com/freewater/archive/2012/09/11/2680480.html Trie树详解及其应用   一.知识简介        ...

  5. Trie树的创建、插入、查询的实现

    原文:http://blog.chinaunix.net/xmlrpc.php?r=blog/article&uid=28977986&id=3807947 1.什么是Trie树 Tr ...

  6. 人人都是 DBA(VII)B 树和 B+ 树

    B 树(B-Tree)是为磁盘等辅助存取设备设计的一种平衡查找树,它实现了以 O(log n) 时间复杂度执行查找.顺序读取.插入和删除操作.由于 B 树和 B 树的变种在降低磁盘 I/O 操作次数方 ...

  7. Atitit 常见的树形结构 红黑树  二叉树   B树 B+树  Trie树 attilax理解与总结

    Atitit 常见的树形结构 红黑树  二叉树   B树 B+树  Trie树 attilax理解与总结 1.1. 树形结构-- 一对多的关系1 1.2. 树的相关术语: 1 1.3. 常见的树形结构 ...

  8. 字典树(Trie树)

    1. trie基础 (1) 是什么? Trie,又称单词查找树或键树,是一种树形结构,是一种哈希树的变种. (2) 性质 根节点不包含字符,除根节点外每一个节点都只包含一个字符 从根节点到某一节点,路 ...

  9. 字典树(Trie Tree)

    在图示中,键标注在节点中,值标注在节点之下.每一个完整的英文单词对应一个特定的整数.Trie 可以看作是一个确定有限状态自动机,尽管边上的符号一般是隐含在分支的顺序中的.键不需要被显式地保存在节点中. ...

随机推荐

  1. leetcode个人题解——#24 Swap Nodes in Pairs

    因为不太熟悉链表操作,所以解决方法烦了点,空间时间多有冗余. 代码中l,r分别是每一组的需要交换的左右指针,temp是下一组的头指针,用于交换后链接:res是交换后的l指针,用于本组交换后尾指针在下一 ...

  2. 20145214《Java程序设计》课程总结

    20145214<Java程序设计>课程总结 每周读书笔记链接汇总 第一周读书笔记 第二周读书笔记 第三周读书笔记 第四周读书笔记 第五周读书笔记 第六周读书笔记 第七周读书笔记 第八周读 ...

  3. Spring Security 快速了解

    在Spring Security之前 我曾经使用 Interceptor 实现了一个简单网站Demo的登录拦截和Session处理工作,虽然能够实现相应的功能,但是无疑Spring Security提 ...

  4. Median of Two Sorted Arrays(hard)

    题目要求: 有两个排序的数组nums1和nums2分别为m和n大小. 找到两个排序数组的中位数.整体运行时间复杂度应为O(log(m + n)). 示例: 我的方法: 分别逐个读取两个数组的数,放到一 ...

  5. 项目uml

    [团队信息] 团队项目: 小葵日记--主打记录与分享模式的日记app 队名:日不落战队 队员信息及贡献分比例: 短学号 名 本次作业博客链接 此次作业任务 贡献分配 备注 501 安琪 http:// ...

  6. Ubuntu下erlang连接SQL SERVER 2008

    erlang连接SQL Server使用ODBC方法,但在网络上还是缺少资料,自己折腾了2天才成功.现在特记录下来,以供大家借鉴. 基本思路是 erlang odbcserver + unixodbc ...

  7. web前端之路 - 开篇

    一 web发展历程 了解事物的历史有助于我们渐进式的从发展的思路清楚了解事物的来龙去脉. 这里有一篇网文写得比较清晰和完整:https://www.tianmaying.com/tutorial/we ...

  8. ssl证书验证的问题

    对于https请求,是需要ssl证书验证的请求的,所以如果在请求时如果不带ssl证书,那么可以忽略证书的验证 有三种方法去实现: 1.Requests请求: 在文档中可以看到:http://docs. ...

  9. Apriori算法详解

    一.Apriori 算法概述Apriori 算法是一种最有影响力的挖掘布尔关联规则的频繁项集的 算法,它是由Rakesh Agrawal 和RamakrishnanSkrikant 提出的.它使用一种 ...

  10. 阻塞 , 非阻塞 , 同步 ,异步 , I/O模型

    •阻塞,非阻塞:进程/线程要访问的数据是否就绪,进程/线程是否需要等待: •同步,异步:访问数据的方式,同步需要主动读写数据,在读写数据的过程中还是会阻塞:异步只需要I/O操作完成的通知,并不主动读写 ...