关于算术编码压缩中频数表的问题

问题描述 投票:0回答:1

我对算术编码的工作原理有很高的了解,但在我读过的资料中(https://neptune.ai/blog/lossless-data-compression-using-arithmetic-encoding-in-python-and -its-applications-in-deep-learninghttps://go-compression.github.io/algorithms/arithmetic/)我不清楚频率表和我们正在压缩的消息之间的关系是。

我的理解是频率表是根据某些消息范围确定的,因此应该代表您将按预期编码的消息。这种理解正确吗?

我的第二个问题涉及为什么频率较大(因此概率较大)的字符占据了间隔的很大一部分。我不认为这与准确性有任何关系。它会以某种方式加速算法吗?为什么不让每个角色都有相同的概率呢?

compression lossless-compression
1个回答
0
投票

我从第二个问题开始:不,这与速度无关。使用概率就是实际进行压缩的

压缩的主要思想:对于常见的消息使用较少的比特,对于稀有的消息使用较多的比特。在理想情况下,我们应该以 50% 的概率使用 1 位来表示消息。因此,压缩实际上关键取决于对频率的了解。

算术编码实现了近乎理想的编码——每当概率范围减少一半时,它就会产生一个比特。低概率符号产生较小的范围 - 因此它们输出更多的位。高概率符号产生较少的比特。概率 >50% 的符号可能不会产生任何位 - 一个位需要多个这样的符号!

计算频率表的方法有很多 - 但它应该尽可能接近输入的真实分布。它们越接近,您获得的压缩效果就越好。请注意,编码器和解码器必须使用相同的频率!

  • 您可以预先计算预期频率并将其硬编码到编码器和解码器中。但是,请注意 - 如果输入不符合预期 - 您将得不到压缩,甚至会得到“扩展”!
  • 您可以根据输入计算频率,并将这些值传递给解码器。当然,存储表格会增加压缩大小。
  • 您可以根据之前的输入计算频率,并在压缩时实时更新它们。算术编码允许随时更改频率。
© www.soinside.com 2019 - 2024. All rights reserved.