数据结构(哈夫曼树):判定编码方案是否为前缀编码

发布时间 2023-08-14 17:38:40作者: AC果

前缀编码定义:
(字符集中)任一编码都不是其它字符的编码的前缀
(字符集中)任一编码都不是其它字符的编码的前缀
(字符集中)任一编码都不是其它字符的编码的前缀
重要的话说三遍!
例:
(1)找出下面不是前缀编码的选项
A{1,01,000,001}
B{1,01,011,010}
C{0,10,110,11}
D{0,1,00,11}

第一步:看A中的第一个数1,看看其他数有没有1开头的。没有。
第二步:看A中的第二个数01,看看其他数有没有01开头的。没有。
第三步:看看A中的第三个数000,看看其他数有没有000开头的。没有。
第四步:看看A中的第四个数001,看看其他数有没有001开头的。没有。
所以A是前缀编码。

其他选项也一样。B、C也一样。来说说D:

第一步,看D中的第一个数,找有0开头的的数,有,是00;其实到这里已经不用看了,因为D已经不是前缀编码了。但第二个数1,是第四个数11的前缀,所以也能作为D不是前缀编码的理由。

(2)5 个字符有如下 4 种编码方案,不是前缀编码的是:

A.01,0000,0001,001,1

B.011,000,001,010,1

C.000,001,010,011,100

D.000,00,01,011,10

对于A选项
第一步:看A中的第一个数01,找有没有其他数是01开头的,没有。
第二步:看A中的第二个树0000,找有没有其他数是0000开头的,很显然没有
…略,反正就是每个数都要和其他3个数比较,看看有没有是它开头的。
对于D选项
第一步:看D的000,没有000开头的,好,继续看00。
第二步:看D的00,找00开头的数,有,是000,所以D不是前缀编码。同理01是011的前缀,所以也可以成为D不是前缀编码的原因。

既然写了就说完去吧,这样搞的原因是:

比如有以下编码串,01101001011用(2)中的A表示,那就是:
01-1-01-001-01-1
如果交由D表示:011-01-00-10-1或者01-10-10-01-011。

很显然,D有两种表示方法。

但如果D中000表示a,00表示b,01表示c,011表示d,10表示e,那D中的两种表示方法,会使信息产生歧义!如果这是以前的通讯编码,用D类型的编码编译或解译,会产生严重的歧义。