正确实现的算术编码算法压缩能力Shannond定理描述的理论极限,是目前已知的压缩能力最强的无损压缩算法。
不过,由于算术编码算法的实现比较复杂,使用它作为默认压缩算法的应用程序还相当少。在Unix平台上非常流行的bzip2(这个工具有命令行模式的Windows版本)使用的就是经过修改的算术编码算法。
目前为止还没有使用算术编码作为默认压缩算法的Windows应用程序,WinRAR和WinIMP能够支持bzip2的解压。除此之外,在最新的JPEG标准中也用到了经过修改的算术编码压缩算法,但JPEG所用的那种算法受专利保护,因此使用时必须获得授权。
在之后的文章会很好的研究这个算法的实现:
现在给出一个简单的实例:
| %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % 算术编码过程实例ssbm.m %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% about={... '本实例说明:' '字符串不能太长,程序不加判断,请注意溢出;' '本实例只限定少数字符串 a b c d e;' '实例只是说明一下算术编码过程。'}; disp(about); str=input('请输入编码的字符串(本程序仅仅是一个实例,请仅输入a b c d e):'); l=0;r=1;d=1; %初始间隔 %程序限定字符为:a、b、c、d、e p=[0.2 0.3 0.1 0.15 0.25]; %字符的概率分布,sum(p)=1 n=length(str); disp('a b c d e') disp(num2str(p)) for i=1:n switch str(i) case 'a' m=1; case 'b' m=2; case 'c' m=3; case 'd' m=4; case 'e' m=5; otherwise error('请不要输入其它字符!'); end %判断字符 pl=0;pr=0; for j=1:m-1 pl=pl+p(j); end for j=1:m pr=pr+p(j); end %概率统计 l=l+d*pl; r=l+d*(pr-pl); strl=strcat('输入第',int2str(i),'符号的间隔左右边界:'); disp(strl); format long disp(l);disp(r); d=r-l; end |
'本实例说明:' '字符串不能太长,程序不加判断,请注意溢出;' '本实例只限定少数字符串 a b c d e;' '实例只是说明一下算术编码过程。' 请输入编码的字符串(本程序仅仅是一个实例,请仅输入a b c d e):'aaabded' a b c d e 0.2 0.3 0.1 0.15 0.25 输入第1符号的间隔左右边界: 0 0.200000000000000 输入第2符号的间隔左右边界: 0 0.040000000000000 输入第3符号的间隔左右边界: 0 0.008000000000000 输入第4符号的间隔左右边界: 0.001600000000000 0.004000000000000 输入第5符号的间隔左右边界: 0.003040000000000 0.003400000000000 输入第6符号的间隔左右边界: 0.003310000000000 0.003400000000000 输入第7符号的间隔左右边界: 0.003364000000000 0.003377500000000 |





