前言 (感谢小甲鱼数据结构与算法视频的指导!!)
- 有损压缩
对于一个图片而言:图片的每个像素各自都有一个颜色,如果把16个像素混成一个颜色,那么图片的大小就会变小,但是就不那么清晰了。这就是压缩编码
- 无损压缩
赫夫曼编码 (知名的压缩编码方案)
例如:一个字节是8位,比如要发送'ABCD'这个4个字符,那么要用4个字节(32位)才能发出去。如果说发送方和接收方都约定用赫夫曼编码,那么可能只要发送8位就行可以了。
1.赫夫曼树(是Huffman编码前身)
1.1定义及介绍:
- 由相同权值的一组叶子结点所构成的二叉树可能有不同的形态和不同的带权路径长度,具有最小带权
路径长度的二叉树称为赫夫曼(Haffman)树。也称最优二叉树,它是n个带权叶子节点构成的所有二
叉树中,带权路径长度最小的二叉树。
- 赫夫曼树是带权路径长度最短的树,权值较大的节点就离根较近。
1.2几个重要的概念
- 节点的权:二叉树中的每个叶子节点对应的一个实际意义的权重数据,这个数据称为节点的权
- 节点的路径长度:从根节点到该节点的路径上的连接数
- 树的路径长度:根节点到所有叶子节点的路径长度之和
-
节点的带权路径长度: 节点的路径长度与节点权值的乘积
- 树的带权路径长度:WPL(Weight Path Length)是树中所有叶子节点的带权路径长度之和
-
WPL的值越小(权值越大的节点离根节点越近),说明构造出了的二叉树性能越优,最优的二叉树称为赫夫曼树
例如:求下面树的带路径长度 ?
由图可知: 节点A的权值为9,路径长度为1;节点C的权值为5,路径长度为2;
节点B的权值为4,路径长度为3;节点D的权值为2,路径长度为3;
WPL= 9*1 + 5*2 + 4*3 + 2*3 = 37
2.赫夫曼树的构造流程
- 取出权值最小的2个节点,权值小的放左子树,权值大的放右子树。
- 模拟出一个节点n1,n1节点的权值是两个最小权值节点的权值之和,这个n1节点连接两个子节点
- 再取出权值最小的节点,与n1节点作比较,权值小的放左边,权值大的放右边
---取出最小的两个节点-->---模拟出一个节点n1--》---再取出权值最小的节点--》
--第2步---》 ---第3步---》-----》这样就构造了一个哈夫曼树
2.1赫夫曼树编写
huffmanTree