前缀码的本质(哈夫曼树)---数据结构

首先回顾一下通信编码背景与基础知识。

在日常通信中,将ABCD分别 以00-01-10-11来编码,是比较原始的方法。然而,我们总是希望传递的电文总长尽可能短
于是,我们设计ABCD的编码分别为0-00-1-01,这样虽简短,但却无法实行,原因是产生了二义性。比如0000可为AAB,BB等。
若要设计 不等长的编码,则必须保证一个字符的编码不是另一个字符的前缀,这种称为前缀码
解决方法:通过构造哈夫曼树即可形成通行上使用的二进制不等长码。
(如下图)
前缀码的本质(哈夫曼树)---数据结构

这样便可以一举两得:

  1. 编码不会产生二义性,即虽然G 01的整个编码01与F 10001的最后两个编码01重合,但也无法在树中找出编码为100的有效数据节点
  2. 由图可见,频数越大,编码相应越短(利用了哈夫曼树的特点),这样一来,也就从总体上减少了传送的信息量,提高了传送效率
    (生活中对于文件的压缩正是利用了这一方法)

利用以上知识,我们便可以来判定前缀码了!
例题:(1){0,10,110,1111} (2){11,10,001,101,0001}
判断他们是否为前缀码。

法一:构造哈夫曼树辨别
法二:直接判别
(对于法二的理解是建立在法一上的)

下面我们来进行求解:
前缀码的本质(哈夫曼树)---数据结构
由“哈夫曼树的数据(权值)节点均为叶子节点”可知,(1)符合哈夫曼树的定义,即(1)是前缀码而(2)不符合,(2)非前缀码。

法二:
(1){0,10,110,1111} (2){11,10,001,101,0001}
(1)中不存在任意数据的整个编码与其他任一数据的前缀码重合,则(1)为前缀码。
(2)排在第二位的整个编码(10)与排在第四位的前缀码(10)完全重合,固然(2)非前缀码。
结合哈夫曼树易知,以101为编码的数据节点是以10为编码的数据节点的右孩子,正应如此,违背了哈夫曼树中数据(权值)节点是叶子节点这一定义,固然(2)非前缀码。

大家在真正理解了这两种做法后,在日后的训练中就可以直接用法二来判别前缀码了~~