二叉树、BTree、B+Tree
二叉树
- 二叉树是一种树形存储结构,通过二叉树,可以有序地存储数据,并且快速查找元素。
- 二叉树节点的,左节点及左节点的所有子节点,都小于自身;右节点及右节点的所有子节点都大于自身。
- 因此,插入数据的时候,可以从根节点开始,不断地进行比较,若小于该节点就左走,大于该节点就往右走,直至找到一个可以让自己成为叶子节点的位置。
- 在搜索的时候,非常方便,就和插入新节点的步骤很类似。从根节点开始,不断地将要搜索的内容和当前位置节点的内容进行比较,若大于该位置节点的内容,就往右走,若小于就往左走,若等于那就是找到了。
- 删除节点也非常简单。如果节点是叶子节点,那就直接删除就好了。如果不是叶子节点,那就首先通过搜索找到需要被删除的节点,然后顺藤摸瓜找到要被删除节点的右节点中最小的节点,替换掉要被删除的节点即可。
- 由上面的方法易知,查找一个节点所需要的时间复杂度是
O(logn)
,比遍历查询O(n)
要快。
BTree
- 又叫多路平衡搜索树,是二叉树的变种。
- 二叉树一个节点就存储一份内容,然后通过两个指针分别指向大于该内容的节点以及小于该内容的节点。
- 而BTree则针对这个思想,对树进行了改良,减少了树的深度,提高查询效率。
- BTree 上面最多可以存储
m-1
个内容,并且可以有m
个指针。意思就是,m-1
个内容可以将区间分割成m
块,每一个指针分别指向那一块区间。 - 当某个节点的内容,超过了
m-1
个的时候,就将m
个内容中,中间的那个内容向上提取,如果上面没有节点了,那它就成为最新的根节点;如果向上还有节点,那就加入它们。而中间内容的左边和右边,形成两个新的节点,由中间的那个内容的节点指向它们。
例子
- 以5叉BTree,插入 C N G A H E K Q M F W L T Z D P R X Y S 数据为例
- 插入前4个字母 C N G A
- 插入H,n>4,中间元素G字母向上分裂到新的节点
- 插入E,K,Q不需要分裂
- 插入M,中间元素M字母向上分裂到父节点G
- 插入F,W,L,T不需要分裂
- 插入Z,中间元素T向上分裂到父节点中
- 插入D,中间元素D向上分裂到父节点中。然后插入P,R,X,Y不需要分裂
- 最后插入S,NPQR节点n>5,中间节点Q向上分裂,但分裂后父节点DGMT的n>5,中间节点M向上分裂
- 到此,该BTree树就已经构建完成了,BTree树 和 二叉树 相比, 查询数据的效率更高, 因为对于相同的数据量
来说,BTree的层级结构比二叉树小,因此搜索速度快
定理
- 通过上面的例子,可以感性地认识到BTree的巧妙之处,它通过不断地抽离,将区间一层一层地分割,我们可以简单地通过比较大小,找到需要内容所处的区间。
- 而通过上面例子,可以推导出一些定理:
- 树的每个节点最多包含m个指针,也就是m个孩子节点。因此每个节点最多由m-1个内容。
- 每次节点满了之后,都会有一次节点的拆分,而拆分出来的孩子节点的个数是固定的,就是
(m-1)/2
。当然如果m-1
是奇数,那就左右子节点的内容个数会差一(小问题小问题)。由此,可以推导出来,除根节点外的所有节点,都至少有ceil((m/2)-1
个内容。 - 而卡在中间的节点,若到达
m
个内容之后,就会开始要分裂。要将现有的m
个节点对半分,让两个新节点承担。因此可以推导出:除根节点与叶子节点外,每个节点至少有ceil(m/2)
个孩子。而节点最多只能有m
个孩子。
B+Tree 结构
- B+Tree为BTree的变种,B+Tree与BTree的区别为:
- n叉B+Tree最多含有n个key,而BTree最多含有n-1个key。
- B+Tree的叶子节点保存所有的key信息,依key大小顺序排列。
- 所有的非叶子节点都可以看作是key的索引部分。
- 由于B+Tree只有叶子节点保存key信息,查询任何key都要从root走到叶子。所以B+Tree的查询效率更加稳定。
- 个人理解,B+Tree的所有非叶子节点也就起到一个分流的左右。例如,当一个数
5>=m>10
的时候,就分流通过P1->P1
进入第一个列表中。 - 因此,除叶子节点外的所有节点,也就起到一个索引的作用。
- 其余操作,和BTree 应该没有太大差别
- MySql索引数据结构对经典的B+Tree进行了优化。
- 在原B+Tree的基础上,增加一个指向相邻叶子节点的链表指针,就形成了带有顺序指针的B+Tree,提高区间访问的性能。
- 因此,在查排好序的索引的内容、查区间的时候,就会非常方便。
- B+Tree是MySQL索引的默认数据结构,很重要!!!
二叉树、BTree、B+Tree相关推荐
- B-Tree/B+-Tree/二叉树/红黑树/Hash表/MySQL底层到底用哪个数据表建立索引做快速查找?
B-Tree/B+-Tree/二叉树/红黑树/Hash表/MySQL底层到底用哪个数据表建立索引做快速查找? ~~B-Tree~~ ==B+Tree== ~~二叉树(Binary Search Tre ...
- Btree/B+tree原理及区别(详解)
1,B-tree 什么是B-tree B-tree是一种多路自平衡搜索树,它类似普通的二叉树,但是Btree允许每个节点有更多的子节点.Btree示意图如下: 由上图可知 B-tree 的一些特点: ...
- 转帖:BTree,B-Tree,B+Tree,B*Tree都是什么
BTree,B-Tree,B+Tree,B*Tree都是什么 转帖自:http://blog.csdn.net/manesking/archive/2007/02/09/1505979.aspx &l ...
- js实现数据结构及算法之二叉树(Binary Tree)
树(Tree) 树是一种非线性的数据结构,分层存储 树常被用来存储具有层级关系的数据,也会被用来存储有序列表等 树和集合一样,不允许相同的元素存在 树由一组以边连接的节点组成 一棵树最上面的节点称为根 ...
- 数据结构学习笔记(六):二叉树(Binary Tree)
目录 1 背景知识:树(Tree) 2 何为二叉树(Binray Tree) 2.1 二叉树的概念与结构 2.2 满二叉树与完全二叉树 2.3 二叉树的三种遍历方式 3 二叉树及其遍历的简单实现(Ja ...
- C语言实现线索二叉树Threaded Binary Tree (附完整源码)
C语言实现线索二叉树Threaded Binary Tree 树节点定义 实现以下7个接口 完整实现和main测试源码 树节点定义 typedef struct Node {int data; /** ...
- 编程基础 - 线索二叉树 (Threaded Binary Tree)
编程基础 - 线索二叉树 (Threaded Binary Tree) 返回分类:全部文章 >> 基础知识 返回上级:编程基础 - 二叉树 (Binary Tree) 本文将介绍线索二叉树 ...
- 二叉树(Binary Tree):先序遍历、中序遍历、后序遍历和层次遍历
二叉树(Binary Tree):先序遍历.中序遍历.后序遍历和层次遍历 树 Tree 二叉树 Binary Tree 先序遍历 Preorder Traversal 中序遍历 Inoreder Tr ...
- [置顶]B-tree/B+tree/B*tree [转]
(原文出处: http://blog.csdn.net/hbhhww/article/details/8206846) B~树 1.前言: 动态查找树主要有:二叉查找树(Binary Search T ...
- 树结构的所有特性(二叉树 完全二叉树 红黑树 btree b+tree)
1.1 树的概念 1.树的特性 1)一棵树中的任意两个结点有且仅有唯一的一条路径连通: 2)一棵树如果有n个结点,则它一定有n−1条边: 3)在一棵树中加一条边将会构成一个回路. 2.二叉树 1)二叉 ...
最新文章
- linux sudo 实现原理
- windwos -- bat脚本
- 架构设计之「服务限流」
- matlab怎么在c 中调用,在C中调用Matlab (转)
- 分享Spring Cloud分布式微服务架构图
- 基于 MaxCompute + Hologres 的人群圈选和数据服务实践
- quarz 定时任务 cron表达式
- (转)Bibtex使用方法
- bankbone 模型简单介绍
- HTML meta 标签 和 http-equiv
- 如何发布自己的 Composer 包
- 微型计算机控制系统常用报警方式,微型计算机控制技术复习资料.docx
- 【nginx系列】深入理解nginx原理
- 计算机网络设计——企业网络规划与搭建
- 多渠道打包中优雅的配置渠道签名
- 嵌入式系统设计师需要掌握什么
- qcc304x笔记之长按开关机(四)
- 人脸识别技术细节总结
- js之win10计算器
- 一个计算机专业大专生大学两年来的学习经历