B-Tree 漫谈 (从二叉树到二叉搜索树到平衡树到红黑树到B树到B+树到B*树)
关于B树的学习还是需要做点笔记。
B树是为磁盘或者其他直接存取辅助存储设备而设计的一种平衡查找树。B树与红黑树的不同在于,B树可以有很多子女,从几个到几千个。比如一个分支因子为1001,高度为2的B树,他可以存储超过10亿个关键字,尽管如此,因为根节点(只有一个)保留在主存中,故这可书中,寻找某一个关键字之多需要两次磁盘存取。

关于磁盘的结构,以及写入,读取数据的原理,这里就略过了。
一、概述:
1) 对于B树的每个节点x有:
a)n[x],当前存储在结点x中的关键字数,
b)关键字以非降序存放,因此 key1[x]<=key2[x]<=...<=keyn[x]
c) leaf[x],是一个布尔值,用来表示结点x是不是叶子节点。
2) 每个内结点包含n[x] + 1个指向其子女的指针 c1[x], c2[x], ... ,c (n[x]+1) [x]。当然叶节点没有c的定义。
3) keyi[x]对存储在各子树中的关键字范围加以分隔。
4) 每个叶节点具有相同的高度。
5)每个节点能包含的关键字数具有一个上界和一个下界。这些界可以用一个称作B树的最小度数的固定整数t >=2 来表示。
定理:h <= log t底 (n+1)/2。 证明略。详见 算法导论。
二、基本操作:
B树与搜索二叉查找树很相似,之时在每个节点所做的不是“二路选择”而是“根据子女数目做多路选择”。
1) 创建一棵空 B树:
首先创建一个空的根结点,再调用INSERT插入新的关键字。最后DISK-WRITE写入
2) 插入:
将新的节点插入到树中,当然是在不违反B树的有效性的前提下。那么如果新节点将要插入的节点y是一个满的叶节点,
故需要引入一个“分裂”操作,将该节点从中间的关键字keyt[y]分为两个各含t-1个关键字的节点。中间关键字被提升
到y的双亲结点。当然,如果y的双亲结点也是满的,那么就要保证在y做分裂操作之前就保证双亲已经通过分裂操作变得不满。
为了满足以上要求:当我们在由上向下查找当前新结点的归属时,就将沿途的满节点分裂,那么就可以保证每当要分裂一
个满结点y时,确保它的双亲不是满的。可以见得:树长高的唯一方式就是 分裂 根节点。
首先,创建一个新结点z, 然后将原来y节点中的 t ... 2t - 1 (t- 1)个关键字剪贴至新结点z,然后将中间关键字放入y的
父节点中。
对B树用单程下行遍历树方式插入关键字:
直接上图了吧。来自 --《算法导论》

一图胜千言啊。
4)删除操作
对于结点x递归调用B-Tree-Delete后,x的关键字个数至少等于最小度t。注意!这个要求比之前的要求(B树中最少关
键字个数t-1)多了一个,使得有时在递归降至某节点的一个子节点之前,一个关键字必须转移到子节点内。这个加强的条件
允许我们在一趟下降的过程中,就可以将一个关键字从树中删掉。

删除操作稍微复杂一点。总结一下复杂度:对于一棵高度为h的B树,它只需要O(h)次磁盘存取操作。所需CPU时间为O(th) = O(tlogt n)。
B-Tree 漫谈 (从二叉树到二叉搜索树到平衡树到红黑树到B树到B+树到B*树)的更多相关文章
- 二叉搜索树、平衡二叉树、红黑树、B树、B+树
完全二叉树: 空树不是完全二叉树,叶子结点只能出现在最下层和次下层,且最下层的叶子结点集中在树的左部.如果遇到一个结点,左孩子不为空,右孩子为空:或者左右孩子都为空:则该节点之后的队列中的结点都为叶子 ...
- 二叉树、二叉搜索树、平衡二叉树、B树、B+树的精确定义和区别探究
概述 关于树的概念很多,B树,B+树,红黑树等等. 但是你去翻翻百度百科,或者用百度或者谷歌搜索一下中文的树结构的介绍,全都是狗屁.没有哪个中文网站是真正精确解释树的定义的,尤其是百度百科. 下面我要 ...
- 41.Validate Binary Search Tree(判断是否为二叉搜索树)
Level: Medium 题目描述: Given a binary tree, determine if it is a valid binary search tree (BST). Assu ...
- 二叉树系列 - 二叉搜索树 - [LeetCode] 中序遍历中利用 pre节点避免额外空间。题:Recover Binary Search Tree,Validate Binary Search Tree
二叉搜索树是常用的概念,它的定义如下: The left subtree of a node contains only nodes with keys less than the node's ke ...
- 108 Convert Sorted Array to Binary Search Tree 将有序数组转换为二叉搜索树
将一个按照升序排列的有序数组,转换为一棵高度平衡二叉搜索树.此题中,一个高度平衡二叉树是指一个二叉树每个节点的左右两个子树的高度差的绝对值不超过1.示例:给定有序数组: [-10,-3,0,5,9], ...
- 数据结构中的树(二叉树、二叉搜索树、AVL树)
数据结构动图展示网站 树的概念 树(英语:tree)是一种抽象数据类型(ADT)或是实作这种抽象数据类型的数据结构,用来模拟具有树状结构性质的数据集合.它是由n(n>=1)个有限节点组成一个具有 ...
- [LeetCode] Convert Sorted List to Binary Search Tree 将有序链表转为二叉搜索树
Given a singly linked list where elements are sorted in ascending order, convert it to a height bala ...
- [LeetCode] Convert Sorted Array to Binary Search Tree 将有序数组转为二叉搜索树
Given an array where elements are sorted in ascending order, convert it to a height balanced BST. 这道 ...
- [LeetCode] 272. Closest Binary Search Tree Value II 最近的二叉搜索树的值 II
Given a non-empty binary search tree and a target value, find k values in the BST that are closest t ...
随机推荐
- vue列表渲染,以及鼠标点击改变样式的问题
在实际项目中,我们进场会遇到鼠标点击该表某个DOM元素的样式,在原生的js或者jquery中,我们会比较熟练的实现这个需求,但是在vue中怎么实现呢? 直接操作DOM?NO!NO! 既然我们的项目使用 ...
- 782B The Meeting Place Cannot Be Changed(二分)
链接:http://codeforces.com/problemset/problem/782/B 题意: N个点,需要找到一个点使得每个点到这个点耗时最小,每个点都同时开始,且都拥有自己的速度 题解 ...
- visioStudio常见问题
问题一: 在做项目时候,使用VisioStudio 2008,一不小心将设置恢复到了原始,一直找不到需要的东西. 比如生成方式“debug”和“Release”选择框没有.一些图标也没有. 经过不断的 ...
- node-sass 安装失败
安装 npm install 时偶尔遇到报错:没有安装python或node-sass 安装失败的问题,百度之后发现是被墙了,但根据百度的方法换了淘宝镜像和用了vpn都安装失败, 原因可能是没有卸载之 ...
- 【04】AngularJS 表达式
AngularJS 表达式 AngularJS 使用 表达式 把数据绑定到 HTML. AngularJS 表达式 AngularJS 表达式写在双大括号内:{{ expression }}. Ang ...
- 【Codeforces 1096D】Easy Problem
[链接] 我是链接,点我呀:) [题意] 让你将一个字符串删掉一些字符. 使得字符串中不包含子序列"hard" 删掉每个字符的代价已知为ai 让你求出代价最小的方法. [题解] 设 ...
- BNUOJ 26224 Covered Walkway
Covered Walkway Time Limit: 10000ms Memory Limit: 131072KB This problem will be judged on HDU. Origi ...
- [luoguP1403] [AHOI2005]约数研究(这。。。)
传送门 用类似筛法的原理,就好啦 ——代码 #include <cstdio> int n, ans; int a[1000001]; int main() { int i, j; sca ...
- 校长的收藏(洛谷 U4534)
题目背景 XS中学的校长喜欢收集手办,家里面都是价值不菲的手办. 校长喜欢给手办们排队并且对于某些些区间内的手办喜爱有加. 现在,校长外出散步(找乐子),你潜入他的房间打算借(偷走)他的手办炫耀一下. ...
- (13)Corner Detection角点检测
import cv2 import numpy as np img=cv2.imread('opencv-corner-detection-sample.jpg') gray = cv2.cvtCol ...