范式哈夫曼编码的快速解码技术

1 引言

对前缀编码进行解码时,最重要的问题是如何快速的确定码字的长度。范式哈夫曼编码具有数字序列属性,因而能通过如下算法确定码字的长度:

int len = 1;
 int code = bs.ReadBit();
 while(code >= first[len])
 {
   code <<= 1;
   code |= (bs.ReadBit()); // append next input bit to code
   len++;
 }
 len--;

另一方面,上述算法逐位进行操作,因而效率不高。快速解码算法的开发便是针对上述两个速度瓶颈而进行的。

1 一个小的改进[1]

首先看一个定理:
对于任意的两个规范哈夫曼码字w1, w2, 其码长分别为l1, l2.如果l1<l2, 那么

I(w1 1^(lmax-l1)) < I(w2 0^(lmax-l2)).

其中lmax为码字的最大长度,1^(lmax-l1)表示lmax-l1个1, w1 1^(lmax-l1)表示w1的二进制序列后面跟lmax-l1个1.w2 0^(lmax-l2)类似. I(w1 1^(lmax-l1))表示二进制序列w1 1^(lmax-l1)的整数值(无符号)。

证明:定义minword[i]为码长为i的码字的最小值,maxword[i]为码长为i的码字的最大值。那么有:
minword[1] = 0
maxword[i] = minword[i]+count[i]-1; // 数字序列属性
minword[i] = 2*(maxword[i-1]+1) = 2*(minword[i-1]+count[i-1])
<==>
minword[i+1] = (maxword[i]+1)<<1
<==>
minword[i+1] 0^(lmax-(i+1)) = (maxword[i]+1)<<1 0^(lmax-(i+1)) = (maxword[i]+1) 0^(lmax-i)
= (maxword[i] 1^(lmax-i)) +1
<==> minword[i+1] 0^(lmax-(i+1)) > maxword[i] 1^(lmax-i) > minword[i] 1^(lmax-i) >
minword[i] 0^(lmax-i) > maxword[i-1] 1^(lmax-(i-1)) ......
再有 minword[l1] <= w1 <= maxword[l2],所以得证。
根据上述定理,我们对first[len]

  • 0
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值