算法——(5)B/B+/红黑树
1. B树——lgdN
B树是平衡多路查找树,主要用于文件系统的索引。
1)定义:
对于一个度数为d的B树,
- 每个结点最多有d个孩子
- 如果根结点不是叶子结点,那它至少有两个孩子
- 每个非叶子结点(非根结点)孩子:⎡d/2⎤<=n<=d
- 每个非叶子结点含有n个关键字信息和n+1个指向孩子的指针,[n, p0, k1, p1, k2,p2,...,kn,pn]:
- ki(i=1,...n)为关键字,且按升序排列,即:k(i-1)<k(i)
- pi(i=0,...,n)为指向子树根的指针,且p(i-1)指向子树中所有的关键字均小于k(i),都大于k(i-1)
- 每个叶子结点都在同一层,并且不包含任何关键字信息
2)B树结点的代码实现

#define MAX 10 /*定义B树的最大阶数为10*/
typdef int KeyType /*KeyType为关键字类型*/
typedef struct BTNode{
int keynum; /*当前结点拥有的关键字数目*/
KeyType key[keynum+1]; /*key[0]不用,有keynum个关键字*/ struct BTNode *parent;
struct BTNode *child[keynum+1]; /*孩子结点的指针:child[0, 1, ...., keynum]*/ }

3)B树的复杂度和高度
对于一个含有n个关键字,d阶B树,它的高度h<=log⎡d/2⎤((n+1)/2)+1
- 根为1个结点,他至少有两个孩子,也就是第二层至少有2个结点,
- 其余非叶子结点,至少有:⎡d/2⎤个结点,因此第三层至少有:2*⎡d/2⎤
- 以此类推:第四层至少有:2*⎡d/2⎤2 、第五层至少有:2*⎡d/2⎤3,...,第l层至少有:2*⎡d/2⎤l-2个结点
所以:

1+2+2*⎡d/2⎤+...+2*⎡d/2⎤h-2 <=n =>1+2*(1-2*⎡d/2⎤h-1)/(1-⎡d/2⎤)<=n =>1+2*(⎡d/2⎤-1)(2*⎡d/2⎤h-1-1)/(⎡d/2⎤-1)<=n 因为d>2 =>h<=log⎡d/2⎤((n+1)/2)+1

4)检索一个key,其查找结点个数的复杂度:O(logd(N))
2. B+树——lndN
其中,浅蓝色的是磁盘块,其中存放了数据项和指针;例如:磁盘1包含了数据项:17,35,但是只是作为索引,而不是真的关键字,所有的关键字都包含在叶子结点。
例如:要查找29,那么首先会把磁盘块1由磁盘加载到内存,此时发生一次IO,在内存中用二分查找确定29在17和35之间,锁定磁盘块1的P2指针,内存时间因为非常短(相比磁盘的IO)可以忽略不计,通过磁盘块1的P2指针的磁盘地址把磁盘块3由磁盘加载到内存,发生第二次IO,29在26和30之间,锁定磁盘块3的P2指针,通过指针加载磁盘块8到内存,发生第三次IO,同时内存中做二分查找找到29,结束查询,总计三次IO。
B+树特性:
1. 内结点存放索引,关键字都存放在叶子结点。——每个磁盘盘存放数据量更多——减少IO次数
因为IO次数取决于B+树的高度h,假设当前数据表的数据为N,每个磁盘块的数据项的数量是m,则h=logm+1N。
2. 最左匹配原则。
当b+树的数据项是复合的数据结构,比如(name,age,sex)的时候,b+数是按照从左到右的顺序来建立搜索树的,比如当(张三,20,F)这样的数据来检索的时候,b+树会优先比较name来确定下一步的所搜方向,如果name相同再依次比较age和sex,最后得到检索的数据;但当(20,F)这样的没有name的数据来的时候,b+树就不知道下一步该查哪个节点,因为建立搜索树的时候name就是第一个比较因子,必须要先根据name来搜索才能知道下一步去哪里查询。比如当(张三,F)这样的数据来检索时,b+树可以用name来指定搜索方向,但下一个字段age的缺失,所以只能把名字等于张三的数据都找到,然后再匹配性别是F的数据了, 这个是非常重要的性质,即索引的最左匹配特性。
3. 红黑树——lgN
红黑树是一种二叉搜索树。能保证在最坏的情况下,基本的几何操作均为O(lgN)
每个节点都含有:color、key、left、right,如果相应的指针域没有,则为NIL
满足五个性质:
- 每个结点要不是红的就是黑的
- 根结点是黑的
- 每个叶结点(空结点NIL)是黑的
- 如果一个结点是红的,则它两个孩子都是黑的
- 对每个结点,从该结点到其子孙结点的所有路径上包含相同数目的黑结点
http://www.cnblogs.com/yangecnu/p/Introduce-Red-Black-Tree.html
算法——(5)B/B+/红黑树的更多相关文章
- Java数据结构和算法(十一)——红黑树
上一篇博客我们介绍了二叉搜索树,二叉搜索树对于某个节点而言,其左子树的节点关键值都小于该节点关键值,右子树的所有节点关键值都大于该节点关键值.二叉搜索树作为一种数据结构,其查找.插入和删除操作的时间复 ...
- 基于visual Studio2013解决算法导论之048红黑树
题目 红黑树 解决代码及点评 // 红黑树.cpp : 定义控制台应用程序的入口点. // #include <stdio.h> #include <stdlib.h> ...
- Sedgewick的红黑树
红黑树一直是数据结构中的难点,大部分关于算法与数据结构的学习资料(包括<算法导论>)对于这部分的讲解都是上来就下定义,告诉我们红黑树这个性质那个性质,插入删除要注意1234点,但是基本没有 ...
- 红黑树(二)之 C语言的实现
概要 红黑树在日常的使用中比较常用,例如Java的TreeMap和TreeSet,C++的STL,以及Linux内核中都有用到.之前写过一篇文章专门介绍红黑树的理论知识,本文将给出红黑数的C语言的实现 ...
- 红黑树(三)之 Linux内核中红黑树的经典实现
概要 前面分别介绍了红黑树的理论知识 以及 通过C语言实现了红黑树.本章继续会红黑树进行介绍,下面将Linux 内核中的红黑树单独移植出来进行测试验证.若读者对红黑树的理论知识不熟悉,建立先学习红黑树 ...
- 红黑树(四)之 C++的实现
概要 前面分别介绍红黑树的理论知识和红黑树的C语言实现.本章是红黑树的C++实现,若读者对红黑树的理论知识不熟悉,建立先学习红黑树的理论知识,再来学习本章. 目录1. 红黑树的介绍2. 红黑树的C++ ...
- 红黑树(五)之 Java的实现
概要 前面分别介绍红黑树的理论知识.红黑树的C语言和C++的实现.本章介绍红黑树的Java实现,若读者对红黑树的理论知识不熟悉,建立先学习红黑树的理论知识,再来学习本章.还是那句老话,红黑树的C/C+ ...
- 红黑树LLRB
LLRB——红黑树的现代实现 一.本文内容 以一种简明易懂的方式介绍红黑树背后的逻辑实现2-3-4树,以及红黑树的插入.删除操作,重点在2-3-4树与红黑树的对应关系上,并理清红黑树相关操作的来龙去脉 ...
- 红黑树与AVL树
概述:本文从排序二叉树作为引子,讲解了红黑树,最后把红黑树和AVL树做了一个比较全面的对比. 1 排序二叉树 排序二叉树是一种特殊结构的二叉树,可以非常方便地对树中所有节点进行排序和检索. 排序二叉树 ...
- JDK源码学习笔记——TreeMap及红黑树
找了几个分析比较到位的,不再重复写了…… Java 集合系列12之 TreeMap详细介绍(源码解析)和使用示例 [Java集合源码剖析]TreeMap源码剖析 java源码分析之TreeMap基础篇 ...
随机推荐
- 优化SQLServer
由于SQLServer,数据文件mdf过大,造成系统异常卡 一. 更改隔离级别 ALTER DATABASE [B2EC] SET SINGLE_USER WITH ROLLBACK IMMEDIAT ...
- ckeditor添加自定义按钮整合swfupload实现批量上传图片
ckeditor添加自定义按钮整合swfupload实现批量上传图片给ckeditor添加自定义按钮,由于ckeditor只能上传一张图片,如果要上传多张图片就要结合ckfinder,而ckfinde ...
- mybatis必知必会二
关联: 嵌套查询:通过执行另外一个 SQL 映射语句来返回预期的复杂类型. 嵌套结果:使用嵌套结果映射来处理重复的联合结果的子集.首先,然让我们来查看这个元素的属性.所有的你都会看到,它和普通的只由 ...
- OpenStack IceHouse 部署 - 1 - 架构说明
参考架构 Architecture from OpenStack Install Guide Reference Architecture Network Isolation 在本次部署中,我们采用了 ...
- webpack打包踩坑之TypeError: Cannot read property 'bindings' of null
file loader介绍:https://www.webpackjs.com/loaders/file-loader/ babel loader介绍:https://webpack.js.org/l ...
- luogu P3065 first——trie树相关
题目描述 Bessie has been playing with strings again. She found that by changing the order of the alphabe ...
- HDU P2089
题目大意为,统计区间内不含4和62的数字的个数: 老实说,看到这题我是抵触的..... 基本上是数位DP的板子,话说数位DP好像全是模板题吧: 预处理,有关的整区间的数字个数: 调用已有的区间,求解0 ...
- 03:成绩排序 个人博客:doubleq.win
个人博客:doubleq.win 03:成绩排序 查看 提交 统计 提问 总时间限制: 1000ms 内存限制: 65536kB 描述 给出班里某门课程的成绩单,请你按成绩从高到低对成绩单排序输出 ...
- sql 传入参数为逗号分隔的字符串处理方法
写了个存储过程,中间用到了类似这种写法 Select * From User Where ID In('1,2,3') 其中'1,2,3'是从外面传进来的参数,就这样执行报错:'1,2,3'转换为in ...
- LintCode2016年8月8日算法比赛----中序遍历和后序遍历构造二叉树
中序遍历和后序遍历构造二叉树 题目描述 根据中序遍历和后序遍历构造二叉树 注意事项 你可以假设树中不存在相同数值的节点 样例 给出树的中序遍历: [1,2,3] 和后序遍历: [1,3,2] 返回如下 ...