哈夫曼编码
在计算机世界中,任何事物都是二进制的,比如说数字、字符、颜色、声音等等,都是以二进制的形式存的,而在物理设备中用磁极或者电极来表示0或1,并通过电流的形式来传输,传输的过程中有数-模和模-数的转换。由于只有0和1两种数字,因而不同的数据就会用0和1不同的编排来表示,这种编排就叫作编码。编码是计算机中一个非常重要的概念,如果没有编码,就不会有计算机,因为只能处理0和1对于现实世界来说没有任何意义。就算对于现实世界来说,如果没有编码,也不会有任何文明。声音也可以算是一种编码,不同的声音表示不同的语义,不同的音调都可能表示不同的意思,而文字更具有编码性,不同字的组合可以表示不同的意义,字母的排列组成单词,不同单词表示不同的意思等等。
但是,采用不同的编码方式,占用的储存空间会不一样。比如27个字母,可以用0-26来表示,而0-26可以用大于等于5位的二进制数来表示,不同的位数编码出来的码文长度不同,因而编码解码的效率也不同。因此,选用更优的编码方式,有得于减少码文,增加编码和解码的速度,在网络传输的过程中也能提高效率。
我们当然希望编码后的码文越短越好,想要码文更短,就要使最常用的符号对应的码尽可能的短,定义一段原文中x符号出现的次数为f(x),x对应的码的长度为g(x),那么如果原文中的所有符号为x0到x26,那么码文的长度就是f(x0)g(x0)+...f(x26)g(x26),f(x)我们无法改变,那么很明显可以看到f(x)越大,将g(x)设置得越小,则总码文长度将会越短。这是一个最优问题。
如果用一棵二叉树来表示的话,所有的叶子节点分别表示一个符号,从根节点到这个叶子节点,每向左走则标志一个0,向右走就标志一个1