你好,我是B树
一、什么是B树?
B树是一棵是具备以下特点的有根树。
1、节点属性
a)x.n:为节点中存储的关键字个数。
b)x.key:为节点中存储的关键字。x.key1、x.key2 ... x.keyx.n 以非降序顺序排列,满足 x.key1 <= x.key2 ... <= x.keyx.n。
c)x.leaf:为当前节点是否为叶子节点(true | false)
d)x.c:为指向子节点的指针,内部节点包含指针个数为 x.n + 1,叶子节点没有子节点,所以没有此属性。
2、分割
关键字 x.key 对存储在子树中的关键字进行分割。某个子节点的所有关键字值范围总是在节点 x 的某两个关键字之间。这个值可能是任何可排序的表示,比如:
3、深度
每个叶子节点具有相同的深度,即树的高度(由根节点到叶子节点的路径长度)。
4、度数
每个节点包含的关键字个数有上下界限制。基本表示单位为B树的最小度数 t(满足 t >= 2):
a)除了根节点外(空树没有关键字,非空树根节点至少包含一个关键字),每个节点至少有 t - 1 个关键字,进而可以推导,每个内部节点至少有 t 个子节点【1.d】。
b)每个节点至多包含 2t - 1 个关键字(此时称之为【满】 状态),进而可以推导,每个内部节点至多有 2t 个子节点【1.d】。
二、B数的高度
首先树的根节点至少包含 1 个关键字,其它节点至少包含 t - 1 个关键字,至少有 t 个子节点【一.4.a】。
我们知道 B 树的度数 t >= 2,所以:
深度为 1 的位置上至少有 2 个节点。
深度为 2 的位置至少有 2 * t 个 节点。
深度为 3 的位置至少有 2 * t * t 个 节点。
... ...
深度为 h 的位置至少有 2 * t * ... * t 个 节点。
图示:
【1】所以所有非根节点个数至少为:2 + 2 * t + 2 * t * t + 2 * t * ... * t = 2 * t0 + 2 * t1+ 2 * t2 + 2 * th-1,标识为 sum(node)
【2】相应的非根节点关键字个数至少为:(t - 1) * sum(node)
【3】那么总的关键字个数至少为: 1 + (t - 1) * sum(node)
【4】我们用 n 表示关键字个数,所以存在 n >= 1 + (t - 1) * sum(node),代入【1】中的求和,最终经过一系列的变换,可以得出B树的高度满足:h <= logt(n+1)/2。
三、B树的搜索
假定我们要查找的关键字为 k,入口节点 x:
a)需要找到 k 在 x 所有关键字中的位置,临界关键字 keyi 满足 k <= keyi 。
b)如果存在 k == keyi 那么查找结束,否则继续。
c)如果 x 为叶子节点,则查找结束,否则继续
d)由 keyi 临界关键字,我们可以得到相应指向子节点的指针 ci。
然后,继续由 ci 指向的子节点作为入口节点,继续上述过程。
四、B树的插入
B树插入新关键字后,必须仍然是一颗合法的B树。
由【一.4.b】我们直到 B 树节点存在一种状态【满】,即当前节点关键字个数为 2t -1。【满】状态的节点插入新节点必须经过特定的前置处理:分裂。
所谓分裂,即将节点由中间关键字作为分割点,分割为两个节点,每个节点包含 t - 1 个关键字,中间节点 x.kt 则上升到父节点中,作为两棵子树的划分点,参见【一.2】。
此处需要注意的是,如果父节点同样为【满】节点,那么在分割点上升之前,同样需要对父节点执行【分裂】操作。
满节点的分裂行为会沿着树向上传播直到不再需要分裂为止。
上面我们描述的过程,是一个自下而上的【满】状态分裂传播行为。
我们知道,要实现节点的插入,首先需要经过一个B树的搜索查找的过程,搜索过程自上而下。
显然,两个过程,有些重复,我们需要的是单向查找插入。
鉴于此,在执行查找的过程中,遇到路径上的满节点,则执行分裂操作,直到找到位置插入节点,这样就避免了自下而上的【分裂】传播行为。
五、B树的删除
B树删除特定关键字后,必须仍然是一颗合法的B树。
B树的插入是一个对节点最大关键字数量的约束满足过程,相应的,B树的删除是一个对节点最小关键字数量的约束满足过程。
保障沿途节点关键字数量至少为度数 t,一遍自根而下执行删除。
你好,我是B树的更多相关文章
- poj 1195:Mobile phones(二维线段树,矩阵求和)
Mobile phones Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 14391 Accepted: 6685 De ...
- SGU 531. Bonnie and Clyde 线段树
531. Bonnie and Clyde 题目连接: http://acm.sgu.ru/problem.php?contest=0&problem=531 Description Bonn ...
- hdu 5480 Conturbatio 线段树 单点更新,区间查询最小值
Conturbatio Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=54 ...
- 【ACM/ICPC2013】线段树题目集合(一)
前言:前一段时间在网上找了一个线段树题目列表,我顺着做了一些,今天我把做过的整理一下.感觉自己对线段树了解的还不是很深,自己的算法能力还要加强.光练代码能力还是不够的,要多思考.向队友学习,向大牛学习 ...
- HDU3727--Jewel (主席树 静态区间第k大)
Jewel Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Subm ...
- HDU 2689 Sort it【树状数组】
Sort it Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Sub ...
- 【BZOJ】1699: [Usaco2007 Jan]Balanced Lineup排队(rmq/树状数组)
http://www.lydsy.com/JudgeOnline/problem.php?id=1699 我是用树状数组做的..rmq的st的话我就不敲了.. #include <cstdio& ...
- 【LeetCode】线段树 segment-tree(共9题)+ 树状数组 binary-indexed-tree(共5题)
第一部分---线段树:https://leetcode.com/tag/segment-tree/ [218]The Skyline Problem [307]Range Sum Query - Mu ...
- css基本选择器
CSS:层叠样式表 (Cascading Style Sheets) 结构层:HTML表现层: CSS行为层: DOM,JavaScript CSS语法结构:div{background:#f00;} ...
随机推荐
- 多尺度目标检测 Multiscale Object Detection
多尺度目标检测 Multiscale Object Detection 我们在输入图像的每个像素上生成多个锚框.这些定位框用于对输入图像的不同区域进行采样.但是,如果锚定框是以图像的每个像素为中心生成 ...
- 【NX二次开发】Block UI 整形
属性说明 常规 类型 描述 BlockID String 控件ID Enable Logical 是否可操作 Group Logical ...
- 【UG二次开发】获取对象类型 UF_OBJ_ask_type_and_subtype
代码: int type=0, subtype=0; UF_OBJ_ask_type_and_subtype(objTag, &type, &subtype);
- 「题解」黑暗塔 wizard
本文将同步发布于: 洛谷博客: csdn: 博客园: 简书. 题目 题意简述 给定 \(y\),求 \(\varphi(x)=y\) 中 \(x\) 的个数和最大值. \(1\leq y\leq 10 ...
- MAT工具定位分析Java堆内存泄漏问题方法
一.MAT概述与安装 MAT,全称Memory Analysis Tools,是一款分析Java堆内存的工具,可以快速定位到堆内泄漏问题.该工具提供了两种使用方式,一种是插件版,可以安装到Eclips ...
- 同事内推的那位Linux C/C++后端开发同学面试没过......
最近同事内推了一位 Linux C/C++ 后端开发的同学到我们公司面试,我是一面的面试官,很遗憾这位工作了两年的同学面试表现不是很好.我问了如下一些问题: "redis持久化机制,redi ...
- Java 读取Word表格中的文本和图片
本文通过Java程序来展示如何读取Word表格,包括读取表格中的文本和图片.下面是具体实现的步骤和方法. 1. 程序环境准备 代码编译工具:IntelliJ IDEA Jdk版本:1.8.0 测试文档 ...
- 什么是TCP和UDP?
1.什么是IP和TCP? Internet协议(IP)是Internet的地址系统,具有将数据包从源设备传递到目标设备的核心功能.IP是建立网络连接的主要方式,奠定了Internet的基础.IP不负责 ...
- ECS实例中的应用偶尔出现丢包现象并且内核日志(dmesg)存在“kernel: nf_conntrack: table full, dropping packet”的报错信息
问题描述 连接ECS实例中的应用时偶尔出现丢包现象.经排查,ECS实例的外围网络正常,但内核日志(dmesg)中存在"kernel: nf_conntrack: table full, dr ...
- 98、配置ftp服务器(vsftpd)
98.1.安装vsftpd: 1.安装: [root@m01 ~]# yum install -y vsftpd #安装vsftpd [root@m01 ~]# vsftpd -v #查看ftp的版本 ...