基本算术编码

1.基本思想
算术编码,就是用一个数编码一串字符串。它的思想是这样的:对一个需要编码的字符串,给出一个初始区间[0, 1),这个区间被分成n份,n是这串字符串中不同字符的个数,每一份占区间长度的比例与相应字符出现次数占整个字符串长度的比例一致,这样,任何一个字符就与区间中的一个子区间对应起来,通过字符串的第一个字符得到对应的区间,然后把得到的第一个区间分成n份,分的方式与分[0, 1)的方式相同,通过第二个字符得到第一个区间中的一个子区间,不断迭代下去,直到字符被用尽,用由最后一个字符得到的区间中的任何一个数字就能代表整个字符串。

2.示例
对字符串aba进行算术编码。因为其中,有两个不同字符,a有两个,b有一个,所以得到如下的初始区间划分:
《基本算术编码》
其中,0.66是2/3的近似值,后面所有的2/3均用0.66代替。
通过第一个字符a得到下面的区间:
《基本算术编码》
对得到的区间进行划分:
《基本算术编码》
通过第二个字符b得到下面的区间:
《基本算术编码》
对得到的区间进行划分:
《基本算术编码》
通过最后一个字符a得到下面的区间:
《基本算术编码》
从区间[0.4356, 0.583704)随便找一个数就能表示字符串aba,比如0.4357。
获得目标区间完整示意图如下:
《基本算术编码》

3.伪代码
《基本算术编码》

4.完整代码
本文描述的算术编码的java实现代码
放在https://github.com/l294265421/algorithm-general
的arithmeticcoding包下,除了实现了编码,还实现了找到目标区间中的最短二进制数和解码。

5.参考文献
《Fundamentals of Multimedia》Second Edition,Ze-Nian Li ,Mark S. Drew, Jiangchuan Liu.

    原文作者:游程编码问题
    原文地址: https://blog.csdn.net/l294265421/article/details/54434643
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞