一、 磁盘中数据存取原理
磁盘由一圈一圈磁道组成,数据存储在磁道中,磁道又由磁颗粒组成,磁颗粒分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,字符空格编码与其相同;
重复上述操作。
注:每一个字符所在节点都没有子节点,即每一个字符的编码都不会为其他字符编码的前缀,因此不会发生不确定无法解析的情况。