Bootstrap

算术编码二进制例题a1a2a3a4_第9讲——算术编码与LZ编码2014.ppt

第9讲——算术编码与LZ编码2014

算术编码与LZ编码 第9讲 算术编码要注意的一些问题 计算精度 随着递推过程的延续,P(u)和F(u)的小数位数也将逐步增加,若不能随时输出和加以截断,运算器将难以容纳。但有所截断必然降低精度,而精度不够会影响译码的正确性。 存储器容量 编成的码字S的长度也是随序列u的长度增加而不断增长。若不及时输出,存储量将非常大。但若输出过早,运算过程中可能还需调整已经输出的部分,那就来不及了。 计算复杂性 每次递归运算都有乘法, P(ak)小数位数影响计算复杂度。在算术编码中使用的概率P(ak)不一定完全等于真实的概率分布,只要设定的分布近似于真实分布就很有效。 自适应算术编码 在实际应用中,可以在编码过程中根据输入的信源序列自适应估计信源的分布,因此可以对任意概率分布的信源(包含有记忆)进行编码。 上述问题现已解决,算术编码已进入实用。 Ziv和Lempel于1977年提出了LZ77算法。1978年,二人又提出了改进算法,后被命名为LZ78。1984年,T. A. Welch提出了LZ78算法的一个变种,即LZW算法。1990年后,T. C. Bell等人又陆续提出了许多LZ系列算法的变体或改进版本。 LZ系列算法用一种巧妙的方式将字典技术应用于通用数据压缩领域,而且,可以从理论上证明LZ 系列算法同样可以逼近信息熵的极限. 下面我们主要介绍LZ78算法。 开始时,先取一个符号作为第一段,然后再继续分段。若出现有与前面相同符号时,就再取紧跟后面的一个符号一起组成一个段,以使与前面的段不同。 这些分段构成字典。 当字典达到一定大小后,再分段时就应查看有否与字典中的短语相同,若有重复就添加符号后再查看,直至与字典中短语不同为止。 由分段规则可见,字典中每一段都是前面某一段后加一个符号。 段号i 和符号序号r 的表示 由于ri,则 所以,对Nj编码所需的比特数为 由上式可见,各段所需的比特数是不同的,是随j的增加而增多。 * * 算术编码 前面所讨论的无失真编码,都是建立在信源符号与码字一一对应的基础上,这种编码方法通常称为块码或分组码,此时信源符号一般是多元的。 如果要对二元序列进行编码,则需采用合并信源符号方法,把二元序列转换成多值符号,转换时二元符号之间的相关性不予考虑,转换后这些多值符号之间的相关性也不予考虑。这就使信源编码的匹配原则不能充分满足,编码效率一般不高。 为了克服这种局限性,需要跳出分组码范畴,从整个符号序列出发,采用递推形式进行编码。 从整个符号序列出发,根据各信源序列的概率将信源序列映射到[0,1) 区间上,然后选取区间内的一点(也就是一个二进制的小数)来表示信源序列。 算术编码基本思想 设信源字母表为{a1, a2},概率p(a1)=0.6, p(a2)=0.4, 将[0,1]按概率比例分为区间[0,0.6],[0.6,l]。 p(a1) p(a2) 0 0.6 1 0 0.36 0.6 0.84 1 p(a1a1) p(a1a2) p(a2a1) p(a2a2) 随着序列的长度不断增加,C所在区间的长度就越短,精确地确定C的位置需要码长也不断增加 设信源符号集A={a1,a2,…,an}, 其相应概率分布为pi, pi >0 (i=1,2, …,n), 定义信源符号的累积概率(分布函数)为 P1= 0; P2= p1 ; P3= p1+p2 ; … 累积概率 r=1,2, …,n pr = Pr+1 - Pr P1 p1 P2 P3 P4 1 p2 p3 … … 0 当A={0,1}二元信源时,P1=P(0)= 0 ; P2 = P(1)= p0 P(0) P(1) 0 1 p0 p1 二元序列的累积概率 引例 设有二元序列S=011,求S的累积概率 P(S)=p(000)+ p(001)+ p(010) 若S后面接0 P(S0)=p(0000)+ p(0001)+ p(0010)+p(0011)+ p

;