熵编码 之 2. Arithmetic coding
来源:互联网 发布:淘宝怎么弄淘口令 编辑:程序博客网 时间:2024/04/30 08:33
算术编码是将被编码的信源表示成实数0~1之间的一个间隔。信源符号序列越长,通过编码表示它的间隔就越短,需要的二进制比特数就越多。
举例说明,例如符号a1,a2,a3出现的概率分别为0.4, 0.5, 0.1。则将[0,1)区间分配给三个符号,分别为:
a1: [0, 0.4)
a2: [0.4, 0.9)
a3: [0.9, 1)
在编码之前,完整的信息间隔是[0, 1),然后根据输入的符号,依次将这个区间按照相应的比例变窄。例如,对”a2a2a2a3”进行编码:
low high
开始编码前: 0 1
a2 0.4 0.9
a2 0.6 0.85
a2 0.7 0.825
a3 0.8125 0.825
新的low和high的计算方法如下:
NewHigh = OldLow + Range * HighRange(X);
NewLow = OldLow + Range * LowRange(X);
其中Range是指OldHigh-OldLow;HighRange(X)表示取得符号X的被分配到区间的上限,例如a2被分配的区间为[0.4, 0.9),其HighRange(a2)=0.9。
通过上面的计算可得到,”a2a2a2a3”所处的区间是[0.8125, 0.825),在该区间中的任意一个数都可以用来表示该字符串。
解码过程如下,以”a2a2a2a3”编码为code = 0.82为例:
0.82所处的区间为[0.4, 0.9),与a2的区间相符,则该字符串的第一个字符为a2。
然后计算新的code: NewCode = (OldCode - LowRange(x))/Range
code = (0.82-0.4)/0.5 = 0.84
0.84所处的区间仍是[0.4, 0.9),故第二个字符是a2。
code = (0.84 - 0.4)/0.5 = 0.88
0.88所处的区间仍是[0.4, 0.9),故第三个字符是a2。
code = (0.88 - 0.4)/0.5 = 0.96
0.96所处区间为[0.9, 1),故第四个字符为a3。
即字符序列为”a2a2a2a3”
- 熵编码 之 2. Arithmetic coding
- 【数据压缩】算术编码ARITHMETIC CODING
- 算术编码(Arithmetic Coding)源代码
- Arithmetic coding
- arithmetic coding
- 熵编码 之 1. Unary coding
- 熵编码 之 3. Golomb coding
- Arithmetic coding and haffman coding
- 编码规则 - coding guidelines
- Sparse Coding稀疏编码
- 稀疏编码Sparse Coding
- Sparse Coding 稀疏编码
- 稀疏编码Sparse coding
- Coding Style编码风格
- LeetCode之Arithmetic Slices
- Coding Help 编码帮助系统
- [Coding]Linux内核编码风格
- 霍夫曼编码(Huffman Coding)
- C指针理解
- Leetcode 细节实现 Pascal's Triangle II
- grep学习笔记
- KMP模式匹配算法
- 关于封装的一点想法
- 熵编码 之 2. Arithmetic coding
- mangos地图管理
- 程序一直报错,不知道该如何改了,望各位大神帮我看看
- PHP扩展使用libpng出core
- UVA10943How do you add?
- 熵编码 之 3. Golomb coding
- Etag、Expires、Last-Modified
- String,StringBuffer,StringBuilder性能分析
- 简单排序