博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
数据结构与算法笔记-----B树,B+树及其应用
阅读量:3906 次
发布时间:2019-05-23

本文共 1425 字,大约阅读时间需要 4 分钟。

学习路径:

在这里插入图片描述

B树的特点

一个M阶的b树具有如下几个特征:

(1)定义任意非叶子结点最多只有M个儿子,且M>2;
(2)根结点的儿子数为[2, M];
(3)除根结点以外的非叶子结点的儿子数为[M/2, M],向上取整;
(4)非叶子结点的关键字个数=儿子数-1;
(5)所有叶子结点位于同一层,且不带信息(实际上为NULL)
(6)k个关键字把节点拆成k+1段,分别指向k+1个儿子,同时满足查找树的大小关系
在这里插入图片描述

B树的基本操作

这是考研数据结构考试大纲的一个考点

在这里插入图片描述
(1)查找
类似于二叉查找树:如上图三叉B树所示,如果关键字比18小,往左边找,如果比30大往右边找,在18-30直接,在中间找。
(2)插入
1.定位,找到最底层,比如说插入40
在这里插入图片描述
已经插入成功了
但是插入60,改变了B树的性质(3阶B树一个节点最多只能有m-1=2个关键字)
在这里插入图片描述
2.分裂结点
中间的数字上移
节点分裂
在这里插入图片描述
(3)删除很复杂
可以参考这篇博客:

B+树

B+树是B树的一种变体,有着比B树更高的查询性能

B+树在考研中只要求会概念,不要求会他的增删改查
在这里插入图片描述
B+树的特征:

1.有k个子树的中间节点包含有k个元素(B树中是k-1个元素),每个元素不保存数据,只用来索引,所有数据都保存在叶子节点。

2.所有的叶子结点中包含了全部元素的信息,及指向含这些元素记录的指针,且叶子结点本身依关键字的大小自小而大顺序链接。

3.所有的中间节点元素都同时存在于子节点,在子节点元素中是最大(或最小)元素。

在这里插入图片描述
B+树比B树的优势有三个:

1、单一节点存储更多的元素,使得查询的IO次数减少;

2、所有查询都要查找到叶子节点,查询性能稳定;

3、所有叶子节点形成有序链表,便于范围查询。

B树和B+树的设计初衷

设计动机

弥合不同的存储级别之间的访问速度上的巨大差异,实现高效的 I/O
事实实践中 : 系统存储容量的增长速度 << 应用问题规模的增长速度

B树是存储关键码的词条结构,比普通的 BST 更宽,更矮 !也称之为平衡多路搜索树

**出现的背景:**平衡二叉树的查找效率是非常高的,并可以通过降低树的深度来提高查找的效率。但是当数据量非常大,树的存储的元素数量是有限的,这样会导致二叉查找树结构由于树的深度过大而造成磁盘I/O读写过于频繁,进而导致查询效率低下。另外数据量过大会导致内存空间不够容纳平衡二叉树所有结点的情况。B树是解决这个问题的很好的结构

采用多叉树结构(由于树节点元素数量是有限的,自然该节点的子树数量也就是有限的)。

为什么MySQL数据库要用B+树存储索引?

(1)文件系统和数据库的索引都是存在硬盘上的,并且如果数据量大的话,不一定能一次性加载到内存中。

数据库中的索引一般是在磁盘上,数据量大的情况可能无法一次装入内存,B+树的设计可以允许数据分批加载,同时树的高度较低,提高查找效率。
树的路(分叉)越多,那么I/O的效率也越高,但是如果分叉接近无限大,那么就退化成有序数组,这样的I/O效率是最高的,但是对内存的负载也特别大,
(2)B树需要做局部的中序遍历,可能要跨层访问。而B+树由于所有数据都在叶子结点,不用跨层。同时由于有链表结构,只需要找到首尾,通过链表就能把所有数据取出来了。
(3)和业务场景有关
如果只选一个数据,那确实是hash更快。但是数据库中经常会选择多条,这时候由于B+树索引有序,并且又有链表相连,它的查询效率比hash就快很多。

转载地址:http://cgqen.baihongyu.com/

你可能感兴趣的文章
【转】SLAM 论文阅读和分类整理
查看>>
【转】Ubuntu 16.04 重置密码(忘记密码)
查看>>
【转】信息奥赛一本通1185:单词排序(OJ题目描述有问题)
查看>>
webclient
查看>>
从百度MP3搜索结果中提取歌曲列表
查看>>
Python Set
查看>>
SWT 中实现最小化到托盘图标,并只能通过托盘的弹出菜单关闭程序
查看>>
Java Table Examples
查看>>
Java read file
查看>>
界面主线程,子线程更新主界面控件
查看>>
敲两遍引号键才出现
查看>>
剑指Offer
查看>>
网页乱码分析
查看>>
java 线程:sleep join yield | wait notify notifyAll
查看>>
Python 包、模块 概念 from 、import 关键字
查看>>
世界各国的手机号码
查看>>
通配符与正则表达式
查看>>
c++ 与 Java 之 红黑树 哈希表 辨析
查看>>
open GL 、DirectX、open CV、 open Inventor 、cocos2dx、unity3d、3dmax辨析
查看>>
理解矩阵
查看>>