给定15个随机的十六进制数(60位),其中每20位(5个十六进制数)中总是至少有1个重复。
最佳的字节压缩方式是什么?
以下是一些示例:
01230 45647 789AA
D8D9F 8AAAF 21052
20D22 8CC56 AA53A
AECAB 3BB95 E1E6D
9993F C9F29 B3130
最初,我试图对20位使用Huffman编码,因为Huffman编码可以将20位缩减至约10位,但是存储表需要超过9位。
以下是一个示例,展示了01230
经过Huffman编码后从20位变为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位(五个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% 减少)时效果最好,但是我认为在 9 比特或更少的空间里存储表格是不可能的。
对于长度为60比特的字符串而言,最坏情况下仍然存在至少3个重复项,在平均情况下,重复项数量更多(这是我的假设)。由于至少存在3个重复项,因此在60比特的连续运行中最多只能有12个符号。
由于存在重复项和符号数量少于16个,我不禁觉得可以使用某种类型的压缩。
01230
从20位转换为10位的示例。这里的10位只是编码,不包括表格(否则似乎会突破香农极限)。 - ParoX