我想压缩二进制流。我知道在每个“1”之后找到“0”的概率更高,在每个“0”之后找到“1”的概率更高。我应该如何编码?我在考虑赖斯代码,但我没有到目前为止......提前感谢您的任何回复。
问问题
484 次
1 回答
3
您是否尝试过一些简单的霍夫曼编码?也许它不会节省那么多,但是如果代码“10”和“01”之一的概率比“00”或“11”高得多,您可以将其重新映射为“0”,将其他代码重新映射为“10” 、“110”和“111”。
当然,这不是最佳选择,因为它将您的流分成 2 位块并且只优化一种情况。但是,可以通过计算/测量更大输入集(如 4 位或 8 位)的概率来改进它,在 8 位的情况下 fe 10101010 和 01010101 将比 00000000 和 11111111 更频繁地使用。
通过算术编码或一些真正使用基于位概率的模型的压缩,您可能会获得更好的结果。
另一种简单的方法是每秒反转一次。由于您提到的概率会倾向于像 0101010 这样的许多交替流部分,这会给您提供许多像 111111 这样的流部分,通常可以通过通常的压缩算法更好地压缩这些部分。但这种方法的成功取决于“概率差距”究竟有多大。
于 2009-04-29T09:38:26.480 回答