哈夫曼树
一、引言
1、信号传输的速度的思考 光的速度是多少? 非常快,一刹。 电子在电路里的传输速度,理论上也是接近光速的。但是既然是这样,为什么我们传输数据的速度为什么不是光速?2004 年以前,我们用 ADSL,速率 512kbps(更慢的拨号上网 56K),2004 年以后,我们用光纤,速率 100Mbps,但是,我们传输数据的速度为什么还是达不到光速?
要想完全了解这个问题,需要了解信号传输的物理原理和一系列的编码调制算法。内容非常多,可以写几车的书了。
在此,我通俗的比喻一下(如上图): 网线/光纤/wifi 就像一条高速公路,我们要传输的信息/数字(0、1)就像一辆辆汽车载的货物,车速就是信号的传输速度,载货量就是数据量。 如果这条高速公路的速度上限是光速,但是汽车的速度却还达不到光速,也就数据传输速率达不到光速。
车速收到很多因素影响(引擎、路况、天气),载货量也受到很多因素的影响(车速、车厢大小、物品摆放方法)。
为了更快,我们不断提高车速,包括硬件层面(更快的引擎——更快的设备/线路),和软件层面(更轻容量更大的车厢、物品摆放方法——更优的信息调制算法)。实现上非常复杂,但是宏观原理上就是这么简单。
硬件层面,在此不谈,我们讨论下软件层面,也就是怎么让同样的车速,装载更多的货物。
2、数据压缩的思考 在同样的车速下,如何装载更多的货物? 同理,在信息传输中,如何用更少的 0、1 表示更多的信息?这就是信息学的一个重要研究领域,每一个突破让网速提高一个大的台阶,给信息化带来巨大的进步。
关于更少的 0、1 表示更多的信息,最直接想到的一个方法就是——压缩。
如果你的电话号码是 138 6666 6666,你会告诉别人:一三八 8 个六? 你要参加 Certified Software Professional Junior,我们会说 CSP-J? 更常见的文言文相对于白话文是不是也是压缩?
所以数据压缩是信息技术中非常重要的一个领域,因为它对于硬件几乎没有要求,只要软件层面进行优化。
数据压缩算法也可以写几车书,今天我们正题是:最著名的、影响最深远的算法之一,叫做哈夫曼编码。
3、哈夫曼树的诞生 1951 年,哈夫曼在麻省理工学院(MIT)攻读博士学位,他和修读信息论课程的同学得选择是完成学期报告还是期末考试。导师罗伯特·法诺(Robert Fano)出的学期报告题目是:查找最有效的二进制编码。由于无法证明哪个已有编码是最有效的,哈夫曼放弃对已有编码的研究,转向新的探索,最终发现了基于有序频率二叉树编码的想法,并很快证明了这个方法是最有效的。哈夫曼使用自底向上的方法构建二叉树,避免了次优算法香农-范诺编码(Shannon–Fano coding)的最大弊端──自顶向下构建树。 1952 年,于论文《一种构建极小多余编码的方法》(A Method for the Construction of Minimum-Redundancy Codes)中发表了这个编码方法。
二、哈夫曼树基础
路径和路径长度
在一棵树中,从一个结点往下可以达到的孩子或孙子结点之间的通路,称为路径。
通路中分支的数目称为路径长度。若规定根结点的层数为 1,则从根结点到第 L 层结点的路径长度为 L-1。