要确定每个字母的比特数算法需要尽可能精确地知道每个字母的出现机率。模型的任务是提供这个数据。模型的预言越好压缩的结果就越好。此外模型必须在压缩和恢复时提出同样的数据。在历史上有许多不同的模型。
静态模型在压缩前对整个文字进行分析计算每个字母的机率。这个计算结果用于整个文字上。
优点:
编码表只需计算一次,因此编码速度高,除在解码时所需要的机率值外结果肯定不比原文长。
缺点:
计算的机率必须附加在编码后的文字上,这使得整个结果加长。
计算的机率是整个文字的机率,因此无法对部分地区的有序数列进行优化。
在这个模型里机率随编码过程而不断变化。多种算法可以达到这个目的:
前向动态:机率按照已经被编码的字母来计算,每次一个字母被编码后它的机率就增高。
反向动态:在编码前计算每个字母在剩下的还未编码的部分的机率。随着编码的进行最后越来越多的字母不再出现,它们的机率成为0,而剩下的字母的机率升高,为它们编码的比特数降低。压缩率不端增高,以至于最后一个字母只需要0比特来编码。
优点:
模型按照不同部位的特殊性优化。
在前向模型中机率数据不需要输送。
缺点:
每个字母被处理后机率要重算,因此比较慢。
计算出来的机率与实际的机率不一样,在最坏状态下压缩的数据比实际原文还要长。
一般在动态模型中不使用机率,而使用每个字母出现的次数。除上述的前向和反向模型外还有其它的动态模型计算方法。比如在前向模型中可以不时减半出现过的字母的次数来降低一开始的字母的影响力。对于尚未出现过的字母的处理方法也有许多不同的手段:比如假设每个字母正好出现一次,这样所有的字母均可被编码。
模型度说明模型顾及历史上多少个字母。比如模型度0说明模型顾及整个原文。模型度1说明模型顾及原文中的上一个字母并不断改变其机率。模型度可以无限高,但是对于大的原文来说模型度越高其需要的计算内存也越多。