如何进行算术解码
发布网友
发布时间:2022-04-20 15:56
我来回答
共2个回答
热心网友
时间:2023-05-06 06:18
奇怪啊..最近连续碰到算术编码的问题....
解码的过程和编码的过程是类似的。
一开始的区间是[0.0, 1.0],然后根据6个字符的概率,把这个区间分成6分,也就是:
a: (0.0, 0.2)
e: (0.2, 0.5)
i: (0.5, 0.6)
o: (0.6, 0.8)
u: (0.8, 0.9)
!: (0.9, 1.0)
然后你看0.32256落在哪个区间,就是哪个字符,现在它落在(0.2, 0.5)之内,所以第一个字符是e
然后再把e的(0,2, 0.5)按照概率分成6分,再看0.32256落在哪个范围内,以此类推
当然,算术编码有一些变种,比如概率是否是自适应性的?一段编码包含几个字符?你问题中的感叹号是否代表结束符?这些都是根据你的实际实现来确定的。你要知道的最重要的一点就是,解码的过程和编码几乎是一致的。
热心网友
时间:2023-05-06 06:18
1:所谓的编码解码可以约看于压缩和解压缩,无论是哪种编码方式,都不可能是对所有字串或者关键串全部通过一组运算来得到key的?首先这已经是一种,无论从运算量、时间量、空间量都不允许这样做,好比如你要求计算机计算
两位数乘两位数,这样的要求还是绝对可以完成的,但是要求几千位数同时乘几千位数,那计算机怎么乘?怎么运算?现在的cpu包括所谓4核的芯,都不可能出现能实现这个要求的指令,而答案必然是分组分部计算,不可能同时运算的。
2:结合第一点的结论,也就是你再算术编码的时候的运算公式是什么,然后你得人为的把它拆分,让字串能每读取一部分的串通过运算累加后也能得到结果。
通过这一步骤你不需要全部读完所有的字串,只需要读取一部分运算,再读部分运算,从而累加结果。
3:无论是字串还是key都是以char[]来存储的,因为能开辟的空间较大,同时也是有限的,看你的堆栈设置,当然一般来说完全够用了,你要是在运行中还出现溢出,那么请回头考虑的你的算法和解码过程了。