【发布时间】:2010-02-15 16:11:41
【问题描述】:
谁能建议压缩算法对 20-30 位数字字符串进行操作?
【问题讨论】:
标签: algorithm compression
谁能建议压缩算法对 20-30 位数字字符串进行操作?
【问题讨论】:
标签: algorithm compression
只需使用每个数字的二进制表示,您就可以轻松地将 30 个 字符 字符串压缩到 15 个字节。例如,1592 可以表示为一系列四位值,如下所示:
0001 0101 1001 0010
当分组为两个四位值的组时,可以在标准 ASCII 中表示为§Т。
此外,如果您的字符串包含许多相同的连续数字,您可以实现Run-Length Encoding 的变体。
【讨论】:
假设你可以有浮点数,你就有可能有 11 个符号:
[0,1,2,3,4,5,6,7,8,9, .]
这意味着每个符号需要 4 位。 3 位最多只能表示 8 个符号。您可以轻松地为每个符号使用 4 位并获得大量压缩。
如果您的字符串中只有整数位,一个简单的解决方案是转换为十六进制,您仍然可以使用每个符号 4 位,同时获得更好的压缩率。 (因为没有 16 个符号的浪费位)
如果您使用 Huffman 压缩,您将获得最佳比特/每符号比率。你可以read more about Huffman compression here。
【讨论】:
www....brianbondy.com/compression/huffman
将其设为 2 个 15 位数字并将它们转换为 2 个 64 位整数?或者它们是浮动的?
【讨论】:
把它分解成几个无符号整数?
“9347692367596047327509604839”
变成:
9 347692367 596047327 509604839
【讨论】:
一个明显的解决方案是将它们“压缩”为二进制数字表示而不是字符串表示。有关示例库,请参阅 this stack overflow 问题。
【讨论】:
我肯定会选择最简单的解决方案,并将它们存储为整数(大小合适,可以是 32 位、64 位或 128 位,具体取决于需要)。使用支持字符的算法对其进行压缩会浪费大量空间,因为它必须为每个字符提供超过 10 个不同的值 (0-9)。
【讨论】:
压缩数字的最常见方法之一(假设您有多个要压缩的数字——它很难压缩一件事)是使用delta encoding。它的工作原理是,如果你知道第一个数字是x,并且它后面的数字比较相似,你可以将后面的数字编码为(x+c1)、(x+c2)等。
在这个方案中,您只需对完整的 x 值进行一次编码,如果您的 c 值小于您的 x,那么您可以节省大量空间。您也可以使用先对数字进行排序的版本,然后您的增量指的是最后一次看到的数字而不是一个数字。使用这种方法,您可以更有效地覆盖更广泛的数字。
【讨论】: