B树、B++树和Trie树

B树

定义:一个非空M元(也称M阶)B树(R.Bayer,1970年)

满足下列条件:

1)每个结点含有m个元素a1<a2<…<am。含有m个元素的结点有m+1个子树,m称为结点长度

2)结点长度m满足:

根结点,1≤m≤M-1     可以有2~M个子树

非根结点,M/2-1≤m≤M-1

可以有M/2~M个子树

3)结点结构中:

pi(i=0,1,…,m)是指向第i个子树的指针

ai(i=1,…,m)是结点值

对于非叶结点,第0个子树上所有元素都小于a1

第i个子树上的元素x满足ai<x<ai+1(1≤i≤m-1)

第m个子树上所有元素都大于am

4)所有的叶均在同一层上

B树的查找

查找元素x的步骤大致如下:

步骤1)如果当前结点为空,则查找失败

步骤2)在当前结点中查找x

如果找到x,查找成功;

否则

若x<a1,沿p0递归向下查找

若ai<x<ai+1(1≤i<m),沿pi递归向下查找

若x>am,沿pm递归向下查找

B树的插入

插入步骤如下:

步骤1)用查找的方法为x找到所在位置,查找路径终止于某个空树,把x插在其父结点的有序位置上

步骤2)如果插入x后,结点不超长,则插入完毕;

否则,进入下一步超长处理

步骤3)将超长结点一分为二,将“中间元素”递归地插在上层结点中

步骤4)若插入波及到根,当根上溢时,把根一分为二,并将中间元素上移,而产生含单元素的新根,使B树升高。

将超长结点d一分为二的操作方法:

1. 超长结点d的元素达M个,令k=M/2,元素ak作为中间元素。

2. 将排在ak左侧的元素和相应的指针被保留在结点d中。

3. 将排在ak右侧的元素和相应的指针移入新结点e中。

4. 将ak连同指向结点e的指针一起插在d的父结点f中,排在指向结点d的指针右侧。

B树的删除

(1)删除x大体步骤:

步骤1)经查找,在某一结点c中找到x

步骤2)根据x所在位置的不同,作出不同的处理

①如果c是叶,直接从叶中删除x

②如果c是非叶,需要用x的“中序前驱”代替x。

注意:

寻找x的中序前驱:

沿着x左侧子树的最右分枝一直下降到某个叶结点s,结点s中最右元素y便是x的前驱,

用y代替x(复制)后,在结点s中删除y。

步骤3)如果删除后d(d指的是真正删除元素的结点)不下溢,删除结束;否则,进入下一步下溢处理。

步骤4)如果d是根(根变空才算下溢),转步骤9;否则,进入下一步。

步骤5)找d的邻近兄弟e。(现在d下溢,d不是根,d的长度小于M/2-1)。

步骤6)如果e长度未到下限,即多于半满(否则,进入步骤7) ,则从e中借一个元素(连同相应的指针)给d,并应适当地调整d和e之间的那个元素,删除结束。

步骤7)将e合并到d,也就是把e中的元素,以及d和e之父f的那个“中间元素”都加到结点d中,结点e变空,删除空结点e。(也可将d合并到e,而删除d)。

步骤8)如果引起f下溢,令d=f转步骤4;否则删除结束。(因f的元素下移,使f的长度减小)

步骤9)(根的长度变为0)删除根,B树高度下降。

B+树

基本概念

(1)B+树与B树主要区别:

所有的数据元素都存储在叶结点中,非叶结点仅存便于查找的索引信息(索引结点)。

1)第i个子树上的元素x满足ai<x≤ai+1可取等号,与B树不同。

2)叶与非叶具有不同的结点结构。叶结点中可以存放储K/2~K个元素;K的可以与树的元数M相等也可以不等。

注意点:

将叶结点“穿成”有序链表。具有“两套”查找机构。

纵向:沿树枝进行查找;

横向:沿链表顺序查找。

B+树的插入

(1)插入x的大体步骤:

步骤1)从根结点起,沿纵向搜索路径为x找到所在的叶结点d。如果叶d未满,则把x插在叶d的有序位置上,插入完毕;否则,进入下一步。

步骤2)叶d已满,叶长达到K,将d一分为二:

产生新叶e,将d的下部K/2个元素移入e,另一半留在d中。

设d的父亲是f,给f加一个儿子e,e排在d之右侧,将e的最小元素的值加到f中作为新索引项,如果f不超长,则插入结束;否则,进入下一步。

步骤3)将f分裂成f和g,并递归地将g插到上一层中。

步骤4)若插入波及到根,当根上溢时,把根一分为二,并产生新根。

B+树的插入示例:

B+树的删除

(1)删除x的大体步骤:

步骤1)沿根到某叶的一条路径查找x,如果x不存在,删除失败,结束;否则,进入下一步。

步骤2)在x所在叶d中删除x。如果删除x后,叶d不下溢,则删除结束;否则,进入下一步。

步骤3)找叶d的兄弟e。如果e处于半满状态,进入步骤4;

否则,从e中移一个元素给叶d。如果e在d的左侧,则移的是e中最大元素;如果e在d的右侧,则移的是e中最小元素,移走元素的同时,修改上层结点中的索引信息,删除结束。

步骤4)将d合并到e。将d的所有元素都给e,删除d,并相应的修改上层结点中的索引信息,也可将e合并到d。

步骤5)如果删除d不引起其父f的下溢,则删除结束;

否则,将递归地波及到更上层结点,或者可以向其兄弟“借”一个索引项和一个子树,或者与其兄弟合并。如果波及根,根长度为0,删除根,整个树的高度下降,删除非叶结点的大体步骤与B树相同。

删除示例:

Trie树

组织结构:

定义:属于数字查找树,用于按数字或字符索引。像大型字典的“书边标目”。

优点:

1.元素(字符串)存储在叶结点中。

2.非叶结点只存储一个字符作为索引。

3.从根到某个叶的路径上字符组合成的字符串,恰是存储于该叶中的元素值(关键字)。

示例:

转载于:https://www.cnblogs.com/gd-luojialin/p/8509268.html

18B树、B++树和Trie树相关推荐

  1. python Trie树和双数组TRIE树的实现. 拥有3个功能:插入,删除,给前缀智能找到所有能匹配的单词...

    #coding=utf-8 #字典嵌套牛逼,别人写的,这样每一层非常多的东西,搜索就快了,树高26.所以整体搜索一个不关多大的单词表 #还是O(1). ''' Python 字典 setdefault ...

  2. c语言 trie树,C语言实现Trie树(字典树)的插入查找删除与遍历操作

    Trie树,也称作是字典树,是一种哈希树的变种,查询效率较高.Trie树可以用于统计或者排序大量的字符串,比如对一系列字符串按照字典序排序. 字典树是一个多叉树,每一个节点上存储的不是一个字符串,而是 ...

  3. 二叉树、红黑树、B树、B+树、图、Trie树合集-----妈妈再也不用担心我的“树”拉!

    这里把各种树做个总结,分别介绍各个树是什么,什么原理,什么特点,什么情况下使用,另外很多时候它们很多地方是相似的,还要加以区别,之前我身边一个很多年开发的经验的老开发还以为B树.B-树.B+树是三种树 ...

  4. 算法 | 动画+解析,轻松理解「Trie树」

    Trie这个名字取自"retrieval",检索,因为Trie可以只用一个前缀便可以在一部字典中找到想要的单词. 虽然发音与「Tree」一致,但为了将这种 字典树 与 普通二叉树 ...

  5. BZOJ 1590.Secret Message 秘密信息(Trie树) [Usaco2008 Dec]【BZOJ计划】

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 BZOJ简单题合集x Weblink https://hydro.ac/d/bzoj/p/1590 P ...

  6. 双数组Trie树(DoubleArrayTrie)Java实现

    http://www.hankcs.com/program/java/%E5%8F%8C%E6%95%B0%E7%BB%84trie%E6%A0%91doublearraytriejava%E5%AE ...

  7. trie树java_【数据结构】Trie树的应用:查询IP地址的ISP(Java实现)

    查询IP地址的ISP 给定一个IP地址,如何查询其所属的ISP,如:中国移动(ChinaMobile),中国电信(ChinaTelecom),中国铁通(ChinaTietong)? 现在网上有ISP的 ...

  8. 数据结构-----Trie树

    Trie树 Trie树,又称字典树,前缀树,单词查找树.是字符串算法中一个比较基础的结构.在字符串查找方面有着线性时间的查找速度,是因为查找时间与Trie中的数据总量无关,只与待查找的字符串的长度有关 ...

  9. 数据结构八-Trie树

    文章出处:极客时间<数据结构和算法之美>-作者:王争.该系列文章是本人的学习笔记. 1 Trie树的使用场景 搜索引擎中的搜索词建议.当你在搜索引擎中输入词,搜索引擎提示给你一个词的列表, ...

  10. 【数据结构与算法】【字符串匹配】Trie树

    单模式串匹配 BF 算法和 RK 算法 BM 算法和 KMP 算法 多模式串匹配算法 Trie 树和 AC 自动机 一. 什么是"Trie树"? 1. 他是一种树形结构,是一种专门 ...

最新文章

  1. CentOS重启启动Apache,VNC
  2. 小心陷阱:二维动态内存的不连续性
  3. AI一分钟 | 特朗普以国家安全为由否决博通收购高通;阿里发起时尚AI算法大赛
  4. linux系统学习之vi编辑
  5. 函数式编程filter函数,list()表示列表显示值
  6. mysql 新建用户无法登陆
  7. vue基础之data
  8. Java TCP通信概念及实例
  9. 配置kafka Server
  10. python主循环方法mainloop_Python:Tkinter:为什么是root.mainloop()而不是app.mainloop()...
  11. 学习笔记: Django之初见
  12. smokeping with tcpping centos 7 环境
  13. 745. 前缀和后缀搜索(每日一难phase2--day27)
  14. 使用Clipboard.js轻松实现“复制到剪贴板”
  15. 深入了解requestFullscreen()方法实现全屏显示
  16. 获取iOS设备唯一标识 uuid
  17. 4A 统一安全管理平台解决方案。
  18. 魂斗罗经典12个版本
  19. Ubuntu学习NO7.Ubuntu指令训练集合
  20. 为什么房价很难降下来?尤其是北京上海深圳这样的大城市,这个比喻很形象...

热门文章

  1. SAP CRM产品主数据错误消息Product ID Not in valid range的分析方法
  2. oracle简体版,oracle|Navicat中文网站
  3. a类论文 计算机视觉,【科研新进展】(21)我校教师首次在计算机视觉领域A类会议上发表论文...
  4. java编写k线_用Java绘制K线 (转)
  5. tensorflow一维卷积输入_tensorflow中一维卷积conv1d处理语言序列的一点记录
  6. vs2013 未将对象引用设置到对象的实例
  7. paging in linux,Linux Operating System
  8. wpf开发仿真3d软件_web 3d 与仿真
  9. 灯也能玩出花样?炫彩灯带!
  10. windows 11 预览版来了