算术编码工作原理.(优选)
- 格式:doc
- 大小:58.50 KB
- 文档页数:5
算术编码+ 统计模型= 数据压缩- 第一部分:算术编码作者:Mark Nelson现在通用的大多数数据压缩方法都属于两大阵营之一:基于字典的方案和统计方法。
在小系统世界中,基于字典的数据压缩技术此时似乎更加流行。
不过,通过将算术编码与强大的模型技术结合在一起,数据压缩的统计方法可以真正达到更好的性能。
这篇分成两部分的文章讨论了如何用几个不同的模型方法与算术编码组合以达到一些重大的压缩率。
本文的第一部分详细说明算术编码是如何工作的。
第二部分说明如何开发一些可以使用算术编码的有效模型以生成高性能压缩程序。
钟爱的术语数据压缩通常通过从输入“文本”获取“符号”、处理它们,并将“代码”写入到压缩后的文件来进行运作。
对于本文来说,符号通常是字节,但是他们很可能只是像素、80 位的浮点数或者EBCDIC 字符。
数据压缩方案需要能够将已压缩的文件转换回到与输入文本的一样的拷贝才是有效的。
如果已压缩的文件比输入文本更小,那么不必说,它也是有用的。
基于字典的压缩系统通过用固定长度码来代替输入文本中的一组符号来进行运作。
字典技术的一个众所周知的例子是LZW 数据压缩。
(请参见DDJ 的89 年第10 期中的“LZW 数据压缩”一文)。
LZW 通过通常从9 到16 位大小范围的码来取代本来无限长的字符串来进行运作。
数据压缩的统计方法采取一种完全不同的方法。
它们通过一次编码多个符号来运作。
将符号编码到可变长的输出码中。
输出码的长度根据符号的概率或者频率进行变化。
低概率的符号用较多的位进行编码,并且高概率符号用较少的位进行编码。
实践中,统计和字典方法之间的分界线并不总是那么清晰。
一些方案并不能明显地归为某一个阵营或者另一个,并且总是有一些使用来自两种技术特性的混合方案。
不过,在本文中讨论的方法使用算术编码来实现纯粹的统计压缩方案。
霍夫曼(Huffman)编码:退役的冠军在数据流中只是能够精确地计算字符的概率还不够,我们也需要能有效地利用这个知识的编码方法。
算术编码工作原理在给定符号集和符号概率的情况下,算术编码可以给出接近最优的编码结果。
使用算术编码的压缩算法通常先要对输入符号的概率进行估计,然后再编码。
这个估计越准,编码结果就越接近最优的结果。
例: 对一个简单的信号源进行观察,得到的统计模型如下:∙60% 的机会出现符号中性∙20% 的机会出现符号阳性∙10% 的机会出现符号阴性∙10% 的机会出现符号数据结束符. (出现这个符号的意思是该信号源'内部中止',在进行数据压缩时这样的情况是很常见的。
当第一次也是唯一的一次看到这个符号时,解码器就知道整个信号流都被解码完成了。
)算术编码可以处理的例子不止是这种只有四种符号的情况,更复杂的情况也可以处理,包括高阶的情况。
所谓高阶的情况是指当前符号出现的概率受之前出现符号的影响,这时候之前出现的符号,也被称为上下文。
比如在英文文档编码的时候,例如,在字母Q 或者q出现之后,字母u出现的概率就大大提高了。
这种模型还可以进行自适应的变化,即在某种上下文下出现的概率分布的估计随着每次这种上下文出现时的符号而自适应更新,从而更加符合实际的概率分布。
不管编码器使用怎样的模型,解码器也必须使用同样的模型。
一个简单的例子以下用一个符号串行怎样被编码来作一个例子:假如有一个以A、B、C三个出现机会均等的符号组成的串行。
若以简单的分组编码会十分浪费地用2 bits来表示一个符号:其中一个符号是可以不用传的(下面可以见到符号B正是如此)。
为此,这个串行可以三进制的0和2之间的有理数表示,而且每位数表示一个符号。
例如,“ABBCAB”这个串行可以变成0.011201(base3)(即0为A, 1为B, 2为C)。
用一个定点二进制数字去对这个数编码使之在恢复符号表示时有足够的精度,譬如0.001011001(base2) –只用了9个bit,比起简单的分组编码少(1 – 9/12)x100% = 25%。
这对于长串行是可行的因为有高效的、适当的算法去精确地转换任意进制的数字。
算数编码的原理
算术编码是一种无损数据压缩算法,它通过将整个数据序列映射到一个连续的数值区间来实现压缩。
算术编码的原理可以概括为以下几个步骤:
确定符号集:确定待编码的符号集,这可以是字符、像素值或其他离散符号的集合。
计算符号概率:对于每个符号,计算其在待编码数据中出现的概率。
通常使用统计方法或概率模型进行估计。
构建累积概率表:根据符号概率计算符号的累积概率。
累积概率表示为每个符号之前的概率总和。
映射到区间:将待编码数据序列中的每个符号映射到一个区间,该区间是 [0, 1) 上的一个子区间。
初始区间为整个区间 [0, 1)。
缩小区间:根据每个符号的累积概率表和当前区间,将当前区间缩小为表示下一个符号的子区间。
缩小区间的过程可以通过二分搜索或线性插值来实现。
重复步骤 5:对于待编码数据序列中的每个符号,重复步骤 5,不断缩小当前区间。
输出编码结果:最终,将最后一个符号所对应的子区间输出为编码结果。
这个子区间可以用一个二进制码或其他形式的码字来表示。
解码过程与编码过程相反,它将编码结果映射回原始数据序列。
解码过程需要使用与编码过程相同的符号概率和累积概率表。
算术编码的优势在于它可以实现较高的压缩比,因为它能够有效地利用符号的概率信息。
然而,算术编码的实现相对复杂,需要对概率进行准确的估计,并且在解码过程中需要高精度的计算。
二进制算术编码原理
二进制算术编码是一种无损数据压缩算法,它可以用来压缩离散符号序列。
其原理如下:
1. 编码器使用一个当前编码范围来表示待编码的符号序列。
初始时,该范围是[0, 1),表示整个编码空间。
2. 对于每个输入符号,编码器将当前编码范围按照符号的概率划分为不重叠的子范围。
概率较大的符号对应的子范围会占据较大的编码范围。
3. 编码器将当前编码范围缩小为对应子范围,并重复步骤2,
直到处理完输入符号序列。
4. 最后,编码器输出编码范围的任意点作为压缩后的二进制码。
解码时,解码器依照与编码器相同的原理,将输入的二进制码逐步解码为符号序列。
解码过程中,解码器根据已解码的前缀确定符号范围,并将该范围划分为对应的子范围。
最终,解码器输出解码结果。
二进制算术编码的优点是可以实现接近于香农定理的压缩率,即接近于输入数据的信息熵。
然而,二进制算术编码的实现较为复杂,需要进行大量的浮点数计算,因此在实际应用中可能会选择其他更简单的压缩算法。
二进制算术编码一、引言二进制算术编码是一种数字编码方式,它将数字转换为二进制数,并通过算术运算来表示数字。
这种编码方式在计算机科学中得到广泛应用,因为计算机只能处理二进制数。
本文将介绍二进制算术编码的原理、应用和优缺点。
二、原理二进制算术编码的原理是将数字转换为二进制数,并通过算术运算来表示数字。
例如,将数字5转换为二进制数101,将数字7转换为二进制数111。
然后,通过加、减、乘、除等算术运算来表示数字。
例如,将数字5和数字7相加,可以得到二进制数1010,表示数字12。
三、应用二进制算术编码在计算机科学中得到广泛应用。
它可以用于数据压缩、加密、错误检测和纠正等方面。
例如,压缩数据时,可以使用二进制算术编码来表示数字,从而减少数据的存储空间。
加密数据时,可以使用二进制算术编码来表示数字,从而增加数据的安全性。
错误检测和纠正时,可以使用二进制算术编码来表示数字,从而检测和纠正数据传输中的错误。
四、优缺点二进制算术编码的优点是可以表示任意精度的数字,而且可以进行高精度的算术运算。
它还可以用于数据压缩、加密、错误检测和纠正等方面。
但是,二进制算术编码的缺点是计算复杂度较高,需要进行大量的算术运算。
此外,它还需要占用较大的存储空间。
五、结论二进制算术编码是一种数字编码方式,它将数字转换为二进制数,并通过算术运算来表示数字。
它在计算机科学中得到广泛应用,可以用于数据压缩、加密、错误检测和纠正等方面。
虽然它有一些缺点,但是它的优点远远超过了缺点。
因此,二进制算术编码是一种非常有用的数字编码方式。
python算术编码算术编码是一种常用的数据压缩算法,其主要原理是将数据转化为一个数值范围内的小数,然后将其储存下来。
在数据解压时,根据压缩时使用的转化方法,就能将原始数据准确地还原出来。
算术编码在实际应用中已经被广泛地运用在文件压缩、图像压缩和语音压缩等方面。
本文将从算术编码的原理、实现方式以及应用场景三个层面进行详细介绍。
一、算术编码的原理算术编码的原理是将一个字符串转化为一个小数,该小数对应的是一个数值范围内的一段连续区间。
这个小数的值越接近1,表示原始字符串中的内容就越靠近该区间的顶端,而值越接近0,表示原始字符串的内容越靠近该区间的底端。
在解码时,将该小数从第一位开始与不同的区间进行匹配,就能够还原出原始的字符串。
二、算术编码的实现方式算术编码是一种非常灵活的编码方式,因此在实现方式上也存在多种不同的方法。
其中一种常见的实现方法是基于概率模型的顺序算术编码。
它的具体流程如下:1. 对于每一个字符,统计其在原始字符串中出现的概率。
2. 将每一个字符的概率映射到数值范围内的一个小数区间。
3. 依次将每个字符的小数区间叠加起来,形成一个新的数值范围。
4. 当一个字符对应的小数区间完全包含在新的数值范围内时,就将新的数值范围作为编码结果储存。
5. 重复步骤4,直到所有字符都被编码。
6. 解码时,根据编码结果以及字符串中每个字符对应的概率,重新定位原始字符串中的每个字符。
三、算术编码的应用场景算术编码在实际的应用场景中已经被广泛地使用,其主要优点是可以实现更高的压缩比,以及更加精确的拟合,从而能够表现出更好的压缩效果。
在文件压缩方面,算术编码可以实现更好的压缩效果,并且不需要占用太多的存储空间。
在图像压缩方面,算术编码能够准确地描述图像的数据内容,从而实现更好的压缩效果。
在语音压缩方面,算术编码的灵活性和高效性使其成为了一种不可替代的压缩方式。
总之,算术编码作为一种常用的数据压缩算法,其原理清晰、实现方式多样,并且拥有广泛的应用场景。
二元序列算术编码是一种可逆的映射方法,它将信源序列中的每个符号序列编码成二进制序列。
算术编码的基本原理是将信源符号的概率分布与二进制小数点后L位相对应,利用概率分布信息将信源符号序列编码成二进制小数。
在二元序列算术编码中,首先需要确定二进制小数点后的位数L,然后根据信源符号的概率分布信息,将每个信源符号编码成相应的二进制小数。
具体而言,对于具有m个取值的信源符号,每个符号对应的概率为P(X=x),其中x为信源符号的取值。
根据这些概率值,可以确定每个符号对应的二进制小数范围。
例如,如果P(X=0)=0.7,则二进制小数0.0-0.6对应的符号为0,而二进制小数0.7-1.0对应的符号为1。
完成编码后,可以将得到的二进制小数转换为二进制序列。
需要注意的是,在算术编码中,二进制序列的长度是不确定的,它取决于信源符号的概率分布。
因此,在实际应用中,需要根据具体需求和信源概率分布来确定二进制序列的长度。
总之,二元序列算术编码是一种有效的数据压缩方法,它利用了信源符号的概率分布信息,将信源符号序列编码成二进制序列。
通过算术编码,可以有效地减少数据冗余,提高数据压缩比。
算术编码的原理算术编码是一种数据压缩算法,它可以将一个长字符串压缩成一个更短的数值。
它与其他数据压缩算法不同,它不是将整个字符串划分成固定长度的块,而是将每个字符映射为一个数字,再将这些数字压缩成一个数值。
算术编码的原理可以简单地概括为以下几点:1. 确定字符集在压缩之前,必须先确定字符集。
字符集包括所有可能出现的字符。
例如,在英语中,字符集包括所有字母、数字以及其他符号。
2. 计算每个字符的概率通过预处理或对大量数据的统计,可以计算每个字符在字符串中出现的概率。
3. 对每个字符进行编码编码的过程是将每个字符映射为一个数字。
这个数字必须能唯一地表示每个字符,并且尽可能不会出现冲突。
编码的方式可以根据具体情况进行选择,例如 ASCII 码就是一种常见的字符编码方式。
4. 计算每个字符的编码区间每个字符根据其在字符串中出现的概率,可以确定一个编码区间。
例如,一个字符在字符串中出现的概率为 0.25,则其编码区间为 0-0.25。
5. 压缩数据将每个字符的编码区间连续地组成一个区间,最终压缩成一个数值。
如果字符集很大,压缩后得到的数值可能非常大,因此需要使用高精度运算来处理。
6. 解压数据解压数据的过程就是将压缩后的数值还原为原始字符串的过程。
解压的过程需要根据先前编码的字符集和编码区间进行计算,从而还原字符串。
总之,算术编码的原理可以简单概括为确定字符集、计算每个字符的概率、为每个字符编码、计算每个字符的编码区间、压缩数据和解压数据。
虽然算术编码的实现比较复杂,但它可以很好地压缩数据,并且是一种通用的数据压缩算法。
算术编码原理算术编码是一种将字符序列压缩成一个浮点数的方法,它的压缩效率比传统的哈夫曼编码更高,因为它可以使用原本不是整数的浮点数表示更多的信息。
本文将介绍算术编码的原理,分为以下几个部分:一、概念解释1.1 算术编码的基本概念算术编码是在一个有限长度的区间内对字符序列进行编码的方式,其中每个字符对应的编码值是一个实数。
编码值在编码区间内是唯一的,且编码值可以通过解码得到压缩前的字符序列。
1.2 字符频率在进行算术编码时,需要知道每个字符在字符序列中出现的频率,频率可以是小数或整数,且每个字符的频率之和必须为1。
二、算法过程2.1 编码过程算术编码主要分为以下几个步骤:(1)定义初始编码区间根据字符频率,可以计算出每个字符的编码区间,例如字符A的编码区间是[0,0.3),字符B的编码区间是[0.3,0.5),字符C的编码区间是[0.5,0.6),字符D的编码区间是[0.6,1]。
(2)收缩编码区间根据每个字符的频率,计算每次的编码区间长度。
例如,如果字符序列是ABCD,且字符频率分别为0.3、0.2、0.1和0.4,那么初始编码区间的长度为1,第一次收缩后,区间缩小到0.3,表示字符A出现的概率为0.3。
第二次收缩后,区间缩小到0.06,表示字符AB出现的概率为0.06。
一直推进到最后,得到压缩后的编码值。
2.2 解码过程解码过程需要使用压缩后的编码值和字符频率进行计算。
例如,解码一个值为0.2的字符时,需要找到0.2所在的字符区间,然后计算该区间对应的字符。
三、算法特点3.1 压缩率高由于算术编码可以对每个字符对应的区间进行无限分割,因此可以表示更多的信息。
相比于传统的哈夫曼编码,算术编码可以达到更高的压缩率。
3.2 复杂度高虽然算术编码的压缩效果好,但是编码和解码的计算复杂度非常高,因此需要配合分治法、搜索算法等其它算法来减少计算量。
3.3 广泛应用算术编码在数据压缩、无损图像压缩、音频压缩、视频压缩等多个领域都有广泛应用。
【MQ算术编码原理及实现】算术编码原理随着多媒体技术的不断运用发展,图像压缩要求更高的性能和新的特征。
为了满足静止图像在特殊领域编码的需求,*****0作为一个新的标准处于不断的发展中,这种新的标准更加注重图像的可伸缩表述。
算术编码是一种变长信源编码技术,其卓越性能使其在多媒体领域得到了越来越广泛的应用。
*****0标准中,提高图像压缩性能的关键技术之一就是MQ算术编码。
MQ算术编码器是一种基于上下文的自适应二进制算术编码器,它继承了IBM的ABIC(自适应双层图像压缩)中Q编码器无乘法的近似和位缓存的策略,增加了条件交换和概率估计状态机中的贝叶斯学习过程,是一种高效率物理可实现的压缩编码算法,非常具有研究价值。
2. 算术编码2.1编码原理简述算术编码是一种非分组码。
编码时信源符号序列连续的进入编码器,通过编码器的运算得到连续的输出。
通常算术编码是讲一条信源符号序列映射成一条码序列,这样的码序列有时也称为码字。
算术编码的实质就是,将一条信源信息序列映射到[0,1)区间中的一个子区间,这种映射是一种一一对应关系,以保证唯一译码,然后取这个子区间内的一点所代表的数值作为码字。
只要码长合适,就可以保证唯一可译。
而当信源序列长度足够大时,每信源符号的平均码长接近信源的熵。
虽然其编码效率很高,但仍然存在缺陷。
首先,其运算需要精确的实数加法和乘法,这些运算在有限精度的计算机上实现是非常困难的。
正是这个原因使得算术编码从提出到实际应用相差了近二十年之久。
直到Rissanen和Pasco分别提出了一个先进后出算法和一个先进先出算法,并由此证明了算术编码可以用有限精度处理技术逼近。
Rubin吸收了两个算法的精华,利用有限精度寄存器,讨论了一般算术编码的实现方法。
在此基础上,Witten,Neal和Cleary做了进一步地精细化,并给出了一个完整的C语言程序。
算术编码的另一缺陷是编码速度太低,这是因为编码迭代过程中含有整数乘除运算,这些运算对于软件执行和硬件设计是十分不利的。
算术编码工作原理在给定符号集和符号概率的情况下,算术编码可以给出接近最优的编码结果。
使用算术编码的压缩算法通常先要对输入符号的概率进行估计,然后再编码。
这个估计越准,编码结果就越接近最优的结果。
例: 对一个简单的信号源进行观察,得到的统计模型如下:•60% 的机会出现符号中性•20% 的机会出现符号阳性•10% 的机会出现符号阴性•10% 的机会出现符号数据结束符. (出现这个符号的意思是该信号源'内部中止',在进行数据压缩时这样的情况是很常见的。
当第一次也是唯一的一次看到这个符号时,解码器就知道整个信号流都被解码完成了。
)算术编码可以处理的例子不止是这种只有四种符号的情况,更复杂的情况也可以处理,包括高阶的情况。
所谓高阶的情况是指当前符号出现的概率受之前出现符号的影响,这时候之前出现的符号,也被称为上下文。
比如在英文文档编码的时候,例如,在字母Q 或者q出现之后,字母u出现的概率就大大提高了。
这种模型还可以进行自适应的变化,即在某种上下文下出现的概率分布的估计随着每次这种上下文出现时的符号而自适应更新,从而更加符合实际的概率分布。
不管编码器使用怎样的模型,解码器也必须使用同样的模型。
一个简单的例子以下用一个符号串行怎样被编码来作一个例子:假如有一个以A、B、C三个出现机会均等的符号组成的串行。
若以简单的分组编码会十分浪费地用2 bits来表示一个符号:其中一个符号是可以不用传的(下面可以见到符号B正是如此)。
为此,这个串行可以三进制的0和2之间的有理数表示,而且每位数表示一个符号。
例如,“ABBCAB”这个串行可以变成0.011201(base3)(即0为A, 1为B, 2为C)。
用一个定点二进制数字去对这个数编码使之在恢复符号表示时有足够的精度,譬如0.001011001(base2) –只用了9个bit,比起简单的分组编码少(1 – 9/12)x100% = 25%。
这对于长串行是可行的因为有高效的、适当的算法去精确地转换任意进制的数字。
编码过程的每一步,除了最后一步,都是相同的。
编码器通常需要考虑下面三种数据:•下一个要编码的符号•当前的区间(在编第一个符号之前,这个区间是[0,1), 但是之后每次编码区间都会变化)•模型中在这一步可能出现的各个符号的概率分布(像前面提到的一样,高阶或者自适应的模型中,每一步的概率并不必须一样)编码其将当前的区间分成若干子区间,每个子区间的长度与当前上下文下可能出现的对应符号的概率成正比。
当前要编码的符号对应的子区间成为在下一步编码中的初始区间。
例: 对于前面提出的4符号模型:•中性对应的区间是 [0, 0.6)•阳性对应的区间是 [0.6, 0.8)•阴性对应的区间是 [0.8, 0.9)•数据结束符对应的区间是 [0.9, 1)当所有的符号都编码完毕,最终得到的结果区间即唯一的确定了已编码的符号串行。
任何人使用该区间和使用的模型参数即可以解码重建得到该符号串行。
实际上我们并不需要传输最后的结果区间,实际上,我们只需要传输该区间中的一个小数即可。
在实用中,只要传输足够的该小数足够的位数(不论几进制),以保证以这些位数开头的所有小数都位于结果区间就可以了。
例: 下面对使用前面提到的4符号模型进行编码的一段信息进行解码。
编码的结果是0.538(为了容易理解,这里使用十进制而不是二进制;我们也假设我们得到的结果的位数恰好够我们解码。
下面会讨论这两个问题)。
像编码器所作的那样我们从区间[0,1)开始,使用相同的模型,我们将它分成编码器所必需的四个子区间。
分数0.538落在NEUTRAL坐在的子区间[0,0.6);这向我们提示编码器所读的第一个符号必然是NEUTRAL,这样我们就可以将它作为消息的第一个符号记下来。
然后我们将区间[0,0.6)分成子区间:•中性的区间是 [0, 0.36) -- [0, 0.6) 的 60%•阳性的区间是 [0.36, 0.48) -- [0, 0.6) 的 20%•阴性的区间是 [0.48, 0.54) -- [0, 0.6) 的 10%•数据结束符的区间是 [0.54, 0.6). -- [0, 0.6) 的 10%我们的分数 .538 在 [0.48, 0.54) 区间;所以消息的第二个符号一定是NEGATIVE。
我们再一次将当前区间划分成子区间:•中性的区间是 [0.48, 0.516)•阳性的区间是 [0.516, 0.528)•阴性的区间是 [0.528, 0.534)•数据结束符的区间是 [0.534, 0.540).我们的分数 .538 落在符号 END-OF-DATA 的区间;所以,这一定是下一个符号。
由于它也是内部的结束符号,这也就意味着编码已经结束。
(如果数据流没有内部结束,我们需要从其它的途径知道数据流在何处结束——否则我们将永远将解码进行下去,错误地将不属于实际编码生成的数据读进来。
)同样的消息能够使用同样短的分数来编码实现如 .534、.535、.536、.537或者是.539,这表明使用十进制而不是二进制会带来效率的降低。
这是正确的是因为三位十进制数据能够表达的信息内容大约是9.966位;我们也能够将同样的信息使用二进制分数表示为.10001010(等同于0.5390625),它仅需8位。
这稍稍大于信息内容本身或者消息的信息熵,大概是概率为0.6%的 7.361位信息熵。
(注意最后一个0必须在二进制分数中表示,否则消息将会变得不确定起来。
)[编辑]精度和再正规化上面对算术编码的解释进行了一些简化。
尤其是,这种写法看起来好像算术编码首先使用无限精度精度的数值计算总体上表示最后节点的分数,然后在编码结束的时候将这个分数转换成最终的形式。
许多算术编码器使用优先精度的数值计算,而不是尽量去模拟无限精度,因为它们知道解码器能够匹配、并且将所计算的分数在那个精度四舍五入到对应值。
一个例子能够说明一个模型要将间隔[0,1]分成三份并且使用8位的精度来实现。
注意既然精度已经知道,我们能用的二进制数值的范围也已经知道。
一个称为再归一化的过程使有限精度不再是能够编码的字符数目的限制。
当范围减小到范围内的所有数值共享特定的数字时,那些数字就送到输出数据中。
尽管计算机能够处理许多位数的精度,编码所用位数少于它们的精度,这样现存的数据进行左移,在右面添加新的数据位以尽量扩展能用的数据范围。
注意这样的结果出现在前面三个例子中的两个里面。
[编辑]算术编码和其他压缩方法的联系[编辑]哈夫曼编码在算术编码和哈夫曼编码之间有很大的相似性 -- 实际上,哈夫曼编码只是算术编码的一个特例 -- 但是由于算术编码将整个消息翻译成一个表示为基数b,而不是将消息中的每个符号翻译成一系列的以b为基数的数字,它通常比哈夫曼编码更能达到最优熵编码。
[编辑]区间编码算术编码与区间编码有很深的相似渊源,它们如此相似以至于通常认为它们的性能是相同的,如果确实有什么不同的话也只是区间编码仅仅落后几个位的值而已。
区间编码与算术编码不同,通常认为它不被任何公司的专利所涵盖。
区间编码的原理是这样的,它没有像算术编码那样从[0,1]开始并根据每个字符出现的概率把它分成相应的不同的小区间,它从如000,000,000,000到999,999,999,999这样一个很大的非负整数区间开始,并且根据每个字符的概率划分成小的子区间。
当子区间小到一定程度最后结果的开头数字出现的时候,那些数字就能够“左移”出整个运算,并且用“右边”的数字替换--每次出现移位时,就大体相当于最初区间的一个回归放大(retroactive multiplication)。
[编辑]关于算术编码的美国专利许多算术编码所用的不同方法受美国专利的保护。
其中一些专利对于实现一些国际标准中定义的算术编码算法是很关键的。
在这种情况下,这些专利通常按照一种合理和非歧视(RAND)授权协议使用(至少是作为标准委员会的一种策略)。
在一些著名的案例中(包括一些涉及 IBM的专利)这些授权是免费的,而在另外一些案例中,则收取一定的授权费用。
RAND条款的授权协议不一定能够满足所有打算使用这项技术的用户,因为对于一个打算生产拥有所有权软件的公司来说这项费用是“合理的”,而对于自由软件和开源软件项目来说它是不合理的。
在算术编码领域做了很多开创性工作并拥有很多专利的一个著名公司是IBM。
一些分析人士感到那种认为没有一种实用并且有效的算术编码能够在不触犯IBM和其它公司拥有的专利条件下实现只是数据压缩界中的一种持续的都会传奇(尤其是当看到有效的算术编码已经使用了很长时间最初的专利开始到期)。
然而,由于专利法没有提供“明确界线”测试所以一种威慑心理总让人担忧法庭将会找到触犯专利的特殊应用,并且随着对于专利范围的详细审查将会发现一个不好的裁决将带来很大的损失,这些技术的专利保护然而对它们的应用产生了一种阻止的效果。
至少一种重要的压缩软件bzip2,出于对于专利状况的担心,故意停止了算术编码的使用而转向Huffman编码。
关于算术编码的美国专利列在下面。
•Patent 4,122,440 — (IBM) 提交日期 March 4, 1977, 批准日期 Oct 24, 1978 (现在已经到期)•Patent 4,286,256 — (IBM) 批准日期 Aug 25, 1981 (大概已经到期)•Patent 4,467,317 — (IBM) 批准日期 Aug 21, 1984 (大概已经到期)•Patent 4,652,856 — (IBM) 批准日期 Feb 4, 1986 (大概已经到期)•Patent 4,891,643 — (IBM) 提交时间 1986/09/15, 批准日期 1990/01/02 •Patent 4,905,297 — (IBM) 批准日期 Feb 27, 1990•Patent 4,933,883 — (IBM) 批准日期 Jun 12, 1990•Patent 4,935,882 — (IBM) 批准日期 Jun 19, 1990•Patent 4,989,000 — (???) 提交时间 1989/06/19, 批准日期 1991/01/29 •Patent 5,099,440•Patent 5,272,478 — (Ricoh)最新文件---------------- 仅供参考--------------------已改成-----------word文本--------------------- 方便更改。