B树、B+树、哈夫曼树

一、 磁盘中数据存取原理

磁盘由一圈一圈磁道组成,数据存储在磁道中,磁道又由磁颗粒组成,磁颗粒分N极和S极。

数据存取原理:电生磁、磁生电。

1.1 数据存储

存数据:磁盘上有磁头,磁头上有线圈,线圈如果通电,其电流方向不同会使磁头磁极不同(电生磁),根据同极相斥、异极相吸的原理会使磁颗粒N/S极发生改变,磁颗粒磁极的两种分布情况分别代表0、1,实现数据存储。

1.2 数据读取

取数据:磁头上线圈不带电,磁颗粒周围存在磁感线,磁头划过时,磁颗粒的磁极不同,产生的磁感线不同,磁头产生的电流方向不同(磁生电),通过感应电流装置读取电流变化,读出0、1数据。

读取出的数据会通过导线直接传输给CPU,由于电流会受电阻(受温度等因素影响)影响不稳定,因此导线传递电压信号,同时,导线一个时刻只能传输一个电压信号,低电压表示0,高电压表示1,一个电压信号占1bit,但是CPU处理数据最少为8bit,即byte类型数据,因此CPU需要等待数据读取,造成CPU性能浪费。因此增加导线(总线)数量,常见的导线(总线)数量有32、64,分别对应32位操作系统和64位操作系统。

但磁盘读取数据4~6ms,CPU处理数据需0.2nm,数据读取速度仍然限制CPU性能,因此在磁盘与CPU间加入内存,数据读取速度约为20ns。

内存中为电容器,通过电容器是否带电可分为0、1数据,此时若电压不稳定,电容器会放电,即如果断电,数据会消失,因此磁盘不可替代,所有数据都存储在磁盘中。

磁盘中按照页进行存储数据,一页为4KB,不够4KB也占一页。磁盘与内存数据传递也按照页进行,CPU再从内存中取出数据。

为了存储尽量多的数据,磁盘中采取链式存储,利用小空间,内存中则采取顺序存储。

二、B树

2.1 B树特点

B树是一种自平衡的树结构,广泛用于数据库和文件系统,尤其适合处理磁盘等块存储设备的数据。其核心特点包括:

多路分支:每个节点可包含多个键和指针,减少I/O操作次数。

有序性:键(key)在节点中按序排列,支持高效查找(如二分法)。

平衡性:所有叶子节点位于同一层,保证操作时间复杂度稳定(O(logn))。

一个M阶B树最多能分M个叉,每个叉最多可存M-1个数据。

2.2 B树构建

以下列数据为例构建五阶B树:

数据存储在key值区域,每个节点的key值是有序的

由于为五阶B树,所以一个分支最多存储四个数据,存储第五个数据是会有一个数据被挤到上一层:

针对之后的数据,先将其与20进行比较,小于20放于左侧,大于20放于右侧,再将其与原有数据进行比较排列,直至节点数据量再次达到5,如下所示:

其中B树上方为未排列的数据。

所有数据排列完成后的B树为:

与红黑树相比,B树层高低,适用于大量数据的查找,因此B树一般用于在磁盘中进行查找。

B树在磁盘中读取数据原理:key值对每个文件进行标号,value值表示页,根据标号从B树上层节点开始查找,找到标号后,读取value域,将对应页的数据传输给内存。

三、B+树

3.1 B+树特点

1、B+树节点与B树相同,能存储的数据少一个

2、B+树的所有叶子节点构成有序的链表

3、B+树的数据被挤上去时,仅有索引上移,数据仍留在原本位置

4、B+树能存储更多的索引值

5、B+树的非叶子节点仅具有索引的作用:只能存储key,不能存储value。

3.2 B+树构建

 以下列数据为例构建五阶B+树:

在第一个节点被挤上去时,结果如下:

数据20仍在叶子节点保留,其索引值被挤到上一层

最终结果如下图所示:

其所有叶子节点为一个有序链表。

3.3 B树与B+树区别

1、B+树的非叶子节点仅具有索引值,在内存相同的情况下,一个节点能存放更多的ke,树的高度就越低。

2、B+树的所有叶子节点都相连,构成的链表为有序链表,对整棵树的遍历只需线性遍历一次叶子节点就好,方便进行区间查找,一般用在数据库底层.

3、B+树直到找到叶子节点才能拿到value值,适用于数据库;B树每一个节点都包含key和value,只要拿到key值,立马可以拿到value值,适用于磁盘。

为什么B+树比B树更适合应用于数据库索引?
       (1)B+树减少了 IO 次数

       由于索引文件很大因此索引文件存储在磁盘上,B+树的非叶子结点只存关键字不存数据,因而单个页可以存储更多的关键字,即一次性读入内存的需要查找的关键字也就越多,磁盘的随机I/O读取次数相对就减少了。

       (2)B+树查询效率更稳定

       B+树的数据只存在在叶子结点上,所以查找效率固定为O(logn),所以B+树的查询效率相比B树更加稳定。

       (3)B+树更加适合范围查找

       B+树叶子结点之间用链表有序连接,所以扫描全部数据只需扫描一遍叶子结点,利于扫库和范围查询;B 树由于非叶子结点也存数据,所以只能通过中序遍历按序来扫。也就是说,对于范围查询和有序遍历而言,B+树的效率更高。

四、哈夫曼树和哈夫曼编码

4.1 哈夫曼树

4.1.1 相关概念

路径:到结点的路线

路径长度:边的个数

节点的权:节点的值

带权路径长度:从根节点到该节点的路径长度与该节点权值的乘积

树的带权路径长度( WPL):所有叶子结点的带权路径长度之和,WPL值最小的是哈夫曼树

4.1.2 构建哈夫曼树

2  3  8  20

1、由小到大对节点权值进行排序;

2、取出节点权值最小的两个,合并为一个新的二叉树;

3、以根节点的权值与剩余节点重新进行比较排序;

4、重复步骤2,最终结果如下:

注:两个权值最小的节点左右不影响,因此哈夫曼树不唯一。

4.2 哈夫曼编码

对于一句话,如"i like bananas",计算机无法直接识别,需要在图形库中找到其对应编码,将其转化为0、1数据,通过高低电压进行传输,接收方再将0、1数据进行分割(如ASCII码8位表示一个字符)转换。

"i like bananas"用ASCII码表示需要112个0、1数据,为了减少数据,提出数据压缩,因此需要变长编码,让出现次数越多的字符编码越短。

注:如ASCII码(8位表示一个)等定常编码,无法进行数据压缩。

变长编码举例如下:

i like bananas

首先统计各字符出现次数:

字符及出现次数             

a:3                                 

n:2                                

i:2                                 

空格:2                          

l:1                                   

k:1                                   

e:1                                    

b:1                          

s:1                  

以各字符出现次数作为权值,权值相同的节点先后位置对结果无影响,最终构建的哈夫曼树如下:

认为向左走为0,向右走为1:

从根节点到相应节点为其哈夫曼编码

字符                       编码 

a:3                           10 

n:2                           001 

i:2                            000

空格:2                      111

l:1                             0100

k:1                            0101

e:1                            110

b:1                            0110

s:1                            0111

该例的编码为:

00011101000000101110.......

对其进行解码,顺序读取编码至与上述字符编码一致的情况:

如读取0,没有字符编码与其相同;再读取00,没有字符编码与其相同;再读取000,字符 i 编码与其相同;从此处截断。

读取1,没有字符编码与其相同;读取11,没有字符编码与其相同;读取111,字符空格编码与其相同;

重复上述操作。

注:每一个字符所在节点都没有子节点,即每一个字符的编码都不会为其他字符编码的前缀,因此不会发生不确定无法解析的情况。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值