Java 算术压缩和解压缩

Java 算术压缩和解压缩,java,math,compression,logarithm,Java,Math,Compression,Logarithm,我一直在研究这种压缩,试图了解它是如何工作的,这就是我得到的。这可能是完全错误的,因为: 假设我们有一个包含“TEST”内容的文件 现在我需要得到概率,因为这个词有3个不同的字符,我做: T -> num_of_this_char_duplicates / number_of_content_char_length = 2/4 = 0.5 E -> 1/4 = 0.25 S -> 1/4 = 0.25 所以从0到1 0----------------0.5--------0.

我一直在研究这种压缩,试图了解它是如何工作的,这就是我得到的。这可能是完全错误的,因为:

假设我们有一个包含“TEST”内容的文件

现在我需要得到概率,因为这个词有3个不同的字符,我做:

T -> num_of_this_char_duplicates / number_of_content_char_length = 2/4 = 0.5
E -> 1/4 = 0.25
S -> 1/4 = 0.25
所以从0到1

0----------------0.5--------0.75----------1
        t               e            s
现在我们从测试中搜索T,T在0-0.5范围内,在该范围内,我们计算T,e,s的新范围

我找到的公式是
new\u upper\u limit=lower\u limit+((上限-下限)*概率)

因此,新的范围将是:

   t        e            s
0----0.25-------0.375--------0.5
字符串e中的第二个字符相同,介于0.25和0.375之间

      t          e             s
0.25----0.3125-------0.34375-------0.375
等等

         t            e              s
0.34375----0.359375------0.3671875------0.375
最后又是一次

0.34375----0.359375
所以最后一个范围应该是压缩数据?对吧?

所以,如果我在最后一个范围内随机选取一个数字,比如说0.355,然后重复这个过程,这个数字就是

between 0 - 0.5, which gives back T letter.
Next 0.355 is between 0.25 - 0.375 which gives back letter E.
Next 0.355 is between 0.34375 - 0.375 which gives back letter S.
Last 0.355 is between 0.34375 - 0.359375 which gives back letter T.
因此,如果所有这些都是正确的,我的问题是:

   t        e            s
0----0.25-------0.375--------0.5
  • 在解码部分,似乎我需要用 预定义的字符能够解码的概率。是吗 对吧?

  • 同样在解码部分,它如何知道0.34375-0.359375是最后一个范围,或者最后一个字符在该范围内,是从字符开始的 长度?和每个字符一样,必须有子范围,每个字符都有子范围 数一数?还是检查是否与上次创建的范围相同

  • 如果是按字符数,我需要最后一个范围还是只需要该范围之间的数字

  • 谢谢你的时间

    一,。是的,对于静态模型,解码器需要知道概率,并且能够像编码器一样计算范围。自适应模型以更多计算为代价避免了这种情况2.一个选项是告诉解码器要解码多少个符号。另一种是对表示数据结束的特殊符号进行编码我不知道你说的3到底是什么意思。@DanMašek,谢谢你的回答!对于第三个,如果最后一个符号的最后一个范围是0.34375-0.359375,我需要这两个数字之间的唯一一个数字,比如0.355,以概率对其他每个符号进行解码。我能把那两个号码换成一个吗?有了符号计数和概率,解码它?你只需要保存一个属于最后一个间隔的数字。由于目标是压缩,因此理想情况下,您应该选择具有最短表示形式的。在您的示例中,以10为基数表示,
    0.35
    的值比
    0.355
    @DanMašek更好。是的,谢谢!还有一个问题可能真的很愚蠢,因为我以前从来没有这样做过,我问的任何人都这么说。很抱歉打扰你,如果有人说用算术编码和整数实现压缩。这是否意味着使用介于0和最大整数值之间的概率范围?哪一个限制了符号的数量?或者整数实现是另一回事。是的,对于静态模型,解码器需要知道概率,并且能够像编码器一样计算范围。自适应模型以更多计算为代价避免了这种情况2.一个选项是告诉解码器要解码多少个符号。另一种是对表示数据结束的特殊符号进行编码我不知道你说的3到底是什么意思。@DanMašek,谢谢你的回答!对于第三个,如果最后一个符号的最后一个范围是0.34375-0.359375,我需要这两个数字之间的唯一一个数字,比如0.355,以概率对其他每个符号进行解码。我能把那两个号码换成一个吗?有了符号计数和概率,解码它?你只需要保存一个属于最后一个间隔的数字。由于目标是压缩,因此理想情况下,您应该选择具有最短表示形式的。在您的示例中,以10为基数表示,
    0.35
    的值比
    0.355
    @DanMašek更好。是的,谢谢!还有一个问题可能真的很愚蠢,因为我以前从来没有这样做过,我问的任何人都这么说。很抱歉打扰你,如果有人说用算术编码和整数实现压缩。这是否意味着使用介于0和最大整数值之间的概率范围?哪一个限制了符号的数量?或者整数实现是另一回事?