B+-树(B+-tree)(1)

简介:

  B-tree(也就是B树,多路搜索树,并不是二叉的)是一种常见的数据结构。使用B-tree结构可以显著减少定位记录时所经历的中间过程,从而加快存取速度。

  B+-树使用广泛,一般用于数据库的索引,综合效率较高。

B-树是Rudolf Bayer, Edward M. McCreight(1970)写的一篇论文《Organization and Maintenance of Large Ordered Indices》中首次提出的。(wikipedia:http://en.wikipedia.org/wiki/B-tree

  They were designed to work well on Direct Access secondary storage devices (magnetic disks). B-trees try to read as much information as possible in every disk access operation.

  磁盘读取数据是以盘块(block)为基本单位的。位于同一盘块中的所有数据都能被一次性全部读取出来。而磁盘IO代价主要花费在查找时间Ts上。因此我们应该尽量将相关信息存放在同一盘块,同一磁道中。或者至少放在同一柱面或相邻柱面上,以求在读/写信息时尽量减少磁头来回移动的次数,避免过多的查找时间Ts。

所以,在大规模数据存储方面,大量数据存储在外存磁盘中,而在外存磁盘中读取/写入块(block)中某数据时,首先需要定位到磁盘中的某块,如何有效地查找磁盘中的数据,需要一种合理高效的外存数据结构,就是下面所要重点阐述的B-tree结构,以及相关的变种结构:B+-tree结构和B*-tree结构。

  B树与红黑树最大的不同在于,B树的结点可以有许多子女,从几个到几千个。那为什么又说B树与红黑树很相似呢?因为与红黑树一样,一棵含n个结点的B树的高度也为O(lgn),但可能比一棵红黑树的高度小许多,应为它的分支因子比较大。所以,B树可以在O(logn)时间内,实现各种如插入(insert),删除(delete)等动态集合操作。

一个B树的例子:21个英文辅音字母:

*每个内部节点x包含n(x)个key和n(x)+1个子节点

*所有叶子拥有同样的高度

*节点x的n(x)个key按非递减顺序存储(key1<=key2<=……keyn)

*假设ki为Ci子树key,有:(结合上面的例子理解)

上面说了B树是多路搜索树,那么对于M阶的B树,它必须满足以下条件:

1.对于root,要么是一个叶子,要么含有[2,M]个儿子

2.非叶子节点必须有[ceil(M/2),M]个儿子(ceil表示向上取)

3.所有叶子拥有同样的高度

4.每个内部节点x包含n(x)个key和n(x)+1个子节点

下面用K[]代表key,P[]代表指向子树的指针,有:

如这样:

让我们来看一个5阶B树:根据定义,每个节点至多有5个子节点和4个key,非root节点至少有3个子节点和2个key.

B树操作:

1)插入(在看下面插入过程时,时刻记住B tree需要满足的条件,你就大概知道为什么这么做了)

1.2插入H

1.3 插入EKQ

1.4 插入M

1.5 插入FWLT

1.6 插入Z

1.7 插入D

1.8 插入S

总结起来就是

(1)对于未满的节点直接插入;

(2)对于已满节点,按照类似插入排序方式插入,并将该节点围绕中心节点拆分成两个节点;

(3)将中心节点上移到父节点;

(4)如父节点也满了,重复上述(2)操作。

2)删除

2.1 删除H

2.2 删除T

2.3 删除R

2.4 删除E

2.5 G不满足条件,合并

总结起来就是

(1)若叶子节点未空(这里的空指已是最少节点),直接删除;

(2)若叶子节点已空,则要与兄弟合并(合并意味着父节点要减少),因此删除后将父节点下移再合并,若父节点下移后为空,删除后可以向丰满(>ceil(M/2))子节点借一节点或向上迭代此过程;

(3)对于非叶子结点,若节点为空而子节点丰满(>ceil(M/2)),删除后向子节点借一节点;若子节点也为空,则合并子节点并向上迭代此过程;

时间: 2024-10-05 06:05:30

B+-树(B+-tree)(1)的相关文章

笛卡尔树cartesian tree

笛卡尔树cartesian tree 笛卡尔树是一种特定的二叉树数据结构,可由数列构造,在范围最值查询.范围top k查询(range top k queries)等问题上有广泛应用.它具有堆的有序性,中序遍历可以输出原数列.笛卡尔树结构由Vuillmin(1980)[1]在解决范围搜索的几何数据结构问题时提出.从数列中构造一棵笛卡尔树可以线性时间完成,需要采用基于栈的算法来找到在该数列中的所有最近小数. 定义 无相同元素的数列构造出的笛卡尔树具有下列性质: 结点一一对应于数列元素.即数列中的每

使用行为树(Behavior Tree)实现游戏AI

原地址:http://blog.csdn.net/akara/article/details/6084786 [原创]使用行为树(Behavior Tree)实现游戏AIby AKara 2010-12-09 @ http://blog.csdn.net/akara @ akarachen(at)gmail.com @weibo.com/akaras 谈到游戏AI,很明显智能体拥有的知识条目越多,便显得更智能,但维护庞大数量的知识条目是个噩梦:使用有限状态机(FSM),分层有限状态机(HFSM)

使用行为树(Behavior Tree)实现网游奖励掉落系统

原地址:http://blog.csdn.net/akara/article/details/6165421 [原创]使用行为树(Behavior Tree)实现网游奖励掉落系统by AKara 2011-01-24 @ http://blog.csdn.net/akara @ akarachen(at)gmail.com @weibo.com/akaras 奖励/掉落系统,涵盖物品,经验,金钱等网游中可直接给予玩家的元素.一个简单,直观,可扩展的掉落系统对网游中的产出控制起非常重要的作用. 奖

线段树(segment tree)

1.概述 线段树,也叫区间树,是一个完全二叉树,它在各个节点保存一条线段(即"子数组"),因而常用于解决数列维护问题,基本能保证每个操作的复杂度为O(lgN). 线段树是一种二叉搜索树,与区间树相似,它将一个区间划分成一些单元区间,每个单元区间对应线段树中的一个叶结点. 对于线段树中的每一个非叶子节点[a,b],它的左儿子表示的区间为[a,(a+b)/2],右儿子表示的区间为[(a+b)/2+1,b].因此线段树是平衡二叉树,最后的子节点数目为N,即整个线段区间的长度. 使用线段树可以

Leetcode 树 Symmetric Tree

本文为senlie原创,转载请保留此地址:http://blog.csdn.net/zhengsenlie Symmetric Tree Total Accepted: 13991 Total Submissions: 44240 Given a binary tree, check whether it is a mirror of itself (ie, symmetric around its center). For example, this binary tree is symmet

Leetcode 树 Same Tree

本文为senlie原创,转载请保留此地址:http://blog.csdn.net/zhengsenlie Same Tree Total Accepted: 15922 Total Submissions: 38418 Given two binary trees, write a function to check if they are equal or not. Two binary trees are considered equal if they are structurally

显示目录树命令tree

-a:显示所有文件,包括隐藏文件 -d:只显示目录 -f:显示完整的文件名,包含路径 -L:显示目录树的深度 [[email protected] /]# tree -L 2 -a -f /home /home |-- /home/99user.ldif |-- /home/Legal | |-- /home/Legal/COPYRIGHT.txt | |-- /home/Legal/Entitlement_de.txt | |-- /home/Legal/Entitlement_es.txt

编程算法 - 后缀树(Suffix Tree) 代码(C)

后缀树(Suffix Tree) 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 给你一个长字符串s与很多短字符串集合{T1,, T2, ...}, 设计一个方法在s中查询T1, T2, ..., 要求找出Ti在s中的位置. 代码: /* * main.cpp * * Created on: 2014.7.20 * Author: Spike */ /*eclipse cdt, gcc 4.8.1*/ #include <iostream> #i

树-伸展树(Splay Tree)

伸展树概念 伸展树(Splay Tree)是一种二叉排序树,它能在O(log n)内完成插入.查找和删除操作.它由Daniel Sleator和Robert Tarjan创造. (01) 伸展树属于二叉查找树,即它具有和二叉查找树一样的性质:假设x为树中的任意一个结点,x节点包含关键字key,节点x的key值记为key[x].如果y是x的左子树中的一个结点,则key[y] <= key[x]:如果y是x的右子树的一个结点,则key[y] >= key[x]. (02) 除了拥有二叉查找树的性质

线段树 Interval Tree

一.线段树 线段树既是线段也是树,并且是一棵二叉树,每个结点是一条线段,每条线段的左右儿子线段分别是该线段的左半和右半区间,递归定义之后就是一棵线段树. 例题:给定N条线段,{[2, 5], [4, 6], [0, 7]}, M个点{2, 4, 7},判断每个点分别在几条线段出现过? 1.构建线段树 2.处理线段 三条线段分割之后 3.查询 对于每一个值我们就可以开始遍历这一颗线段树,加上对于结点的count字段便是在线段中出现的次数 比如对于4,首先遍历[0, 7],次数 = 0+1=1:4在