目录
堆
要讲哈夫曼树,我们从堆进行引入。
用于满足一种新的需求:计算机有时候需要优先处理某些任务。在这了抽象成挑选最大/最小值进行操作。
仍然是采用链表或者数组实现有限队列。
用什么方法构建堆?
1. 数组(结构简单,麻烦在于删除某个目标后,后面所有元素位置需要往前挪一位)
2. 链表(结构相对复杂,也是需要遍历寻找目标,删除比较方便吧)
3. 有序数组(插进去的时候就找好位置再插,这样能直接找到最值进行操作。但是难点在于插入位置不好找。)
4. 有序链表(结构更复杂了,插入元素比较复杂,删除方便)
每个方法都有优有缺。
堆的特点
1. 结构性
2. 有序性
任何一个节点的关键字是其子树所有结点的最大值(或者最小值)。
最大堆:又称“大顶堆”
最小堆:又称“小顶堆”
哈夫曼树 · 前言
哈夫曼树又叫做最优二叉树,可以将其看作一种特殊的二叉树。
可以说是从堆引入的哈夫曼树;堆的作用是构造最大堆和最小堆实现挑选最值删除的东西,而哈夫曼树也是寻找max和min并对其进行操作。
哈夫曼树的原理:出现频率较高的数占空间小,出现频率较低的数占空间更大。从而实现不压缩数据且节省空间的一种存储方式。
哈夫曼树的构成
堆的构造是在所有数字中挑选两个最大/最小的数字合并,再继续挑选继续合并。而哈夫曼树是在数据中挑选两个出现频率最低的数进行合并。
如何构建哈夫曼树
在数据中挑选两个出现频率最低的数进行合并,直到合并完所有元素。
注意:我们需要的字符必须都放在叶结点上。
哈夫曼编码
使用哈夫曼树进行编码,需要注意👇
字符只在叶结点上。(作用是避免二义性。保证每一个参数都没有后缀只有前缀(路径上的数就代表前/后缀)
为了方便理解,我在这里放上一张图片👇
图虫中左支全部为0,右支全部为1。如此一来,路径所组成的数就是该字符对应的编码。