数据结构:判定编码方案是否为前缀编码

前缀编码定义:
(字符集中)任一编码都不是其它字符的编码的前缀
(字符集中)任一编码都不是其它字符的编码的前缀
(字符集中)任一编码都不是其它字符的编码的前缀
重要的话说三遍!
例:
(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类型的编码编译或解译,会产生严重的歧义。

评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值