哈夫曼编码原理了解一下

什么是哈夫曼编码呢?这种编码方法在1952年由美国计算机科学家戴维·哈夫曼先生提出,它是一种数据压缩技术。

这是一种很著名的编码方法哦,我们来了解一下吧。

为啥说它是一种数据压缩技术呢,这完全因为它的编码思想:根据字符出现的概率大小进行编码,出现概率高的字符使用较短的编码,出现概率低的字符使用较长的编码。

我们可以想一下,假设有一段文本,我们要给里面的每个字符都编码,对于一个出现概率很高的字符,如果我们给它编很长的码元,那么总体编码的平均码长就会变得很长,降低编码效率。你们现在明白为啥大概率字符使用较短码字,小概率字符使用较长码字了吧?就是为了使平均码长尽可能短!所以才说它是一种数据压缩技术嘛。

看个例子

哈夫曼编码原理了解一下_第1张图片

假设在一段文本中,字母A,B,C,D,E,F,G出现的概率分别为0.23,0.21,0.18,0.15,0.13,0.07,0.03。

(1)我们先从这些概率中挑出两个最小的:0.07和0.03,给相应的路径分配0和1。

这里的分配规则没有固定的,统一就可以了。比如我定的分配规则是两个概率中小的分配0,大的分配1。

(2)0.03加0.07的和为0.1,接下来再用0.1和其余的五个概率:0.23,0.21,0.18,0.15,0.13进行比较,挑出其中最小的两个:0.1和0.13,给相应的路径分配0和1,0.1和0.13求和,得0.23,再和0.23,0.21,0.18,0.15作比较。

(3)可以对照着上面的图理解,一直重复(1)和(2)的步骤,直到最后求得的两个概率和为1为止。

就这样,我们在路径中记录了很多的0和1。是不是很像一棵放倒的树呢?字母对应的概率相当于叶子节点,最后的概率1相当于根节点。只要按顺序找出从根节点到叶子节点的0和1,就知道每个字母的编码是什么啦。

比如从根节点到字母A的路径上有0,1,所以字母A的编码就是01;从根节点到字母F的路径上记录着1,0,0,1,所以字母F的编码就是1001。

很容易看出,这样的编码方法确实使得小概率字符的码字较长(比如G的码字为1000,码长为4),大概率字符的码字较短(比如A的码字为01,码长为2)。

要注意的一点是:哈夫曼编码得到的码不是唯一的。因为每次对最小的两个概率分配0和1是任意的,还有当相比较的几个概率中有相等的概率时排序也是任意的。

光看哈夫曼的原理描述可能觉得很难理解,结合例子看就好了。我已经很努力地解释得容易理解一点咯。

化繁为简,就是这么炫酷。

哈夫曼编码原理了解一下_第2张图片


你可能感兴趣的:(原理)