基本算术编码

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.

  • 4
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值