【发布时间】:2021-01-26 08:09:09
【问题描述】:
给定 15 个随机十六进制数(60 位),其中每 20 位运行总是至少有 1 个重复(5 个十六进制)。
压缩字节的最佳方式是什么?
这里有一些例子:
01230 45647 789AA
D8D9F 8AAAF 21052
20D22 8CC56 AA53A
AECAB 3BB95 E1E6D
9993F C9F29 B3130
最初我一直在尝试仅在 20 位上使用 Huffman 编码,因为 Huffman 编码可以从 20 位下降到 ~10 位,但存储表需要超过 9 位。
这是显示 20 位的细分 -> 01230 的 10 位
Character Frequency Assignment Space Savings
0 2 0 2×4 - 2×1 = 6 bits
2 1 10 1×4 - 1×2 = 2 bits
1 1 110 1×4 - 1×3 = 1 bits
3 1 111 1×4 - 1×3 = 1 bits
然后我尝试对所有 300 位(5 个 60 位运行)进行霍夫曼编码,这是上面示例中给出的映射:
Character Frequency Assignment Space Savings
---------------------------------------------------------
a 10 101 10×4 - 10×3 = 10 bits
9 8 000 8×4 - 8×3 = 8 bits
2 7 1111 7×4 - 7×4 = 0 bits
3 6 1101 6×4 - 6×4 = 0 bits
0 5 1100 5×4 - 5×4 = 0 bits
5 5 1001 5×4 - 5×4 = 0 bits
1 4 0010 4×4 - 4×4 = 0 bits
8 4 0111 4×4 - 4×4 = 0 bits
d 4 0101 4×4 - 4×4 = 0 bits
f 4 0110 4×4 - 4×4 = 0 bits
c 4 1000 4×4 - 4×4 = 0 bits
b 4 0011 4×4 - 4×4 = 0 bits
6 3 11100 3×4 - 3×5 = -3 bits
e 3 11101 3×4 - 3×5 = -3 bits
4 2 01000 2×4 - 2×5 = -2 bits
7 2 01001 2×4 - 2×5 = -2 bits
这总共节省了 8 位,但 8 位不足以存储霍夫曼表。似乎由于数据的随机性,您尝试使用霍夫曼编码的位数越多,它的效果就越差。霍夫曼编码似乎在 20 位(减少 50%)时效果最好,但在 AFAIK 中以 9 位或更少位存储表格是不可能的。
在 60 位字符串的最坏情况下,仍然至少有 3 个重复,平均情况下有超过 3 个重复(我的假设)。由于至少 3 次重复,在 60 位运行中最多可以拥有的符号只有 12 个。
由于重复加上不到 16 个符号,我不禁觉得可以使用某种类型的压缩
【问题讨论】:
-
@MarkAdler 我用
01230将 20 位转换为 10 位的示例更新了问题。 10 位只是编码,不包括表格(否则这似乎会打破香农限制) -
您是要压缩 60 位还是 60*N 位?
标签: compression huffman-code entropy information-theory