算法导轮之B树的学习
最近学习了算法导轮里B树相关的知识,在此写一篇博客作为总结。
1.引言
2.B树的定义
- 每个节点x均有如下属性:
- n表示存储在该节点的关键字个数
- n个关键字本身key1、key2……keyn以非降序存放,即key1 <= key2 <= …… <= keyn
- 一个leaf布尔值表示该节点是否为叶节点
- 每个内部节点包含了n+1个孩子,叶节点没有孩子
- 关键字keyi对存储在各子树中的关键字范围加以分割:即比keyi小的元素在其左子树,比keyi大的元素在其右子树
- 每个叶节点具有相同的深度
- 每个节点包含的关键字个数有上界与下界。我们定义B树的最小度数为t,则除根节点外的每个节点至少有t-1个关键字,每个节点最多有2t-1个关键字(即每个节点最少有t个孩子,最多有2t个孩子)(当一个节点有2t-1个关键字时,我们称它为满的)。
3.B树的插入
分裂节点
插入
- 在根节点,由于P < Q 而且 Q < X,进入P与X之间的子节点
- 发现该子节点是满的,则进行分裂,把关键字T上升到父节点,原子节点分为RS与UV,分为在T关键字的左右
- 由于Q < T,于是进入T的左子节点
- 在RS叶节点中找到对应位置并加入
- 发现根节点是满的,分裂根节点,上移P
- L < P 进入P的左子节点
- G < L < M,进入G与M关键字间的节点
- 在叶节点的相应位置中插入
- F < P,进入P的左子节点
- F < G,进入G的左子节点
- 发现满的节点,分裂,上移C
- F > C,进入C的右子节点
- 在叶节点的相应位置中插入
4.B树的删除
- 关键字k在叶节点中:直接删除
- 关键字k在内部节点中,分三种情况:
- k的左子节点拥有t个关键字,则把k的左子节点的最后一个关键字(假设为j)上移到父节点,然后递归的删除j
- k的右子节点拥有t个关键字,则把k的右子节点的第一个关键字(假设为l)上移到父节点,然后递归的删除l
- k的左右子节点都只有t-1个关键字,则把k下降与左右子节点合并成一个拥有2t-1个关键字的节点,然后递归的删除k
- 看该节点的相邻兄弟节点是否含有至少t个关键字,如果是则向相邻的兄弟节点“借一个关键字”(一该节点的左节点为例:把左节点的最后一个关键字上升至父节点,然后父节点位置的节点下移到关键字个数为t-1的节点上)
- 如果该节点相邻的兄弟节点都只含有t-1个关键字,则选择一个兄弟节点合并,并把两兄弟之间的父节点下移
- F < P,进入P的左子节点
- C < F < G,进入C与G之间的子节点
- 在叶节点中删除F
- M < P,进入P的左子节点
- 在内部节点中发现M,查看M的左子节点JKL,拥有3个关键字,则把最后一个关键字L上升至M的位置,递归的删除L
- 节点JKL是叶节点,直接删除L即可
- G < P,进入P的左子节点
- 在内部节点中发现G,查看G的左右子节点均只有2个关键字(不足最小度数3个),下降G关键字并合并其左右子节点
- 节点DEGJK为叶节点,直接删除G即可
- D < P,进入P的左子节点
- 发现内部节点CL只有2个关键字(不足最小度数3个),其兄弟节点也只有2个关键字,下降父节点P,与兄弟节点一起合并成一个节点
- 由于C < D < L,进入C与L间的子节点
- DEJK节点是叶节点,直接删除D即可
- B < C,进入E的左子节点
- 发现节点AC只有两个关键字,其兄弟节点EJK有三个关键字,则E上移到父节点,C下移到子节点,变为节点ABC
- 节点ABC为叶节点,直接删除B即可
算法导轮之B树的学习的更多相关文章
- 从K近邻算法谈到KD树、SIFT+BBF算法
转自 http://blog.csdn.net/v_july_v/article/details/8203674 ,感谢july的辛勤劳动 前言 前两日,在微博上说:“到今天为止,我至少亏欠了3篇文章 ...
- Java数据结构和算法(一)树
Java数据结构和算法(一)树 数据结构与算法目录(https://www.cnblogs.com/binarylei/p/10115867.html) 前面讲到的链表.栈和队列都是一对一的线性结构, ...
- python常用算法(5)——树,二叉树与AVL树
1,树 树是一种非常重要的非线性数据结构,直观的看,它是数据元素(在树中称为节点)按分支关系组织起来的结构,很像自然界中树那样.树结构在客观世界中广泛存在,如人类社会的族谱和各种社会组织机构都可用树形 ...
- 萌新笔记——用KMP算法与Trie字典树实现屏蔽敏感词(UTF-8编码)
前几天写好了字典,又刚好重温了KMP算法,恰逢遇到朋友吐槽最近被和谐的词越来越多了,于是突发奇想,想要自己实现一下敏感词屏蔽. 基本敏感词的屏蔽说起来很简单,只要把字符串中的敏感词替换成"* ...
- 数据结构与算法系列研究五——树、二叉树、三叉树、平衡排序二叉树AVL
树.二叉树.三叉树.平衡排序二叉树AVL 一.树的定义 树是计算机算法最重要的非线性结构.树中每个数据元素至多有一个直接前驱,但可以有多个直接后继.树是一种以分支关系定义的层次结构. a.树是n ...
- 数据结构与算法(九):AVL树详细讲解
数据结构与算法(一):基础简介 数据结构与算法(二):基于数组的实现ArrayList源码彻底分析 数据结构与算法(三):基于链表的实现LinkedList源码彻底分析 数据结构与算法(四):基于哈希 ...
- Java数据结构和算法(二)树的基本操作
Java数据结构和算法(二)树的基本操作 数据结构与算法目录(https://www.cnblogs.com/binarylei/p/10115867.html) 一.树的遍历 二叉树遍历分为:前序遍 ...
- 用KMP算法与Trie字典树实现屏蔽敏感词(UTF-8编码)
前几天写好了字典,又刚好重温了KMP算法,恰逢遇到朋友吐槽最近被和谐的词越来越多了,于是突发奇想,想要自己实现一下敏感词屏蔽. 基本敏感词的屏蔽说起来很简单,只要把字符串中的敏感词替换成“***”就可 ...
- 第15个算法-实现 Trie (前缀树)(LeetCode)
解法代码来源 :https://blog.csdn.net/whdAlive/article/details/81084793 算法来源:力扣(LeetCode)链接:https://leetcode ...
随机推荐
- centos7.0下的 systemctl 用法
参考链接: http://man.linuxde.net/systemctl
- Docker学习笔记 - Docker客户端和服务端
学习内容: Docker客户端和服务端的通讯方式:client和自定义程序 Docker客户端和服务端的连接方式:socket 演示Docker客户端和服务端之间用remote-api通讯:nc ...
- Mego开发文档 - 从EF6/EFCore迁移到Mego
从EF6/EFCore迁移到Mego框架 如果您有EntityFragmework6或EntityFragmeworkCore的开发经验,在首次接触Mego框架时会发现这两个框架非常相似,本文将帮忙您 ...
- Python学习之dict和set
#coding=utf-8 # dict dict= {'bob': 40, 'andy': 30} print dict['bob'] # 通过dict提供的get方法,如果key不存在,可以返回N ...
- hdu 6095 Rikka with Competition---思维题贪心
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=6095 题目大意: 任意两个人相比,相差大于K,分低的淘汰,否则两人都有可能赢,剩下的继续比,问有最多 ...
- xpath的一般用法与特殊用法
# xpath的使用 安装lxml from lxml import etree Selector = etree.HTML(网页代码) Selector.xpath(一段神奇的代码) xpath的一 ...
- AtomicInteger类的理解及使用
AtomicInteger在多线程并发场景的使用 AtomicInteger提供原子操作来进行Integer的使用,因此十分适合高并发情况下的使用. AtomicInteger位于包package j ...
- OpenGL平面阴影
几种绘制阴影的方法 在OpenGL中,比较常见的绘制阴影的方法有:shadow mapping,shadow volumes以及一种在红宝书上提及的适合在确定平面上绘制阴影的方法. 平面阴影 在确定的 ...
- 从三个开源项目认识OpenFlow交换机 - OVS
在SDN/NFV的网络革新技术浪潮的引领下,催生了诸多数据面开源方案的诞生.业界知名度较高的有OVS(Open vSwitch).FD.io (Fast Data I/O).ODP(Open Data ...
- Centos常用命令之:文件操作
在centos中,常用的文件操作命令有: ◇touch:建置新文件或者修改文件时间◇cat:从第一行开始显示文件内容◇tac:从最后一行开始显示文件内容,和cat相反◇nl:显示的时候,顺道输出行号◇ ...