Algorithm 数字字符串的压缩

Algorithm 数字字符串的压缩,algorithm,compression,Algorithm,Compression,有谁能推荐压缩算法来处理20-30位的数字字符串吗?将其设置为2个15位数字,并将其转换为2个64位整数?还是浮动?只需使用每个数字的二进制表示形式,就可以轻松地将30个字符串压缩到15个字节。例如,1592可以表示为一系列四位值,如下所示: 0001 0101 1001 0010 当以两个四位值分组时,可以用标准ASCII表示为§tt 此外,如果字符串包含许多相同的连续数字,则可以实现的变体。一个明显的解决方案是将它们“压缩”为二进制数字表示,而不是字符串表示。参见问题示例库。将其分解为几个

有谁能推荐压缩算法来处理20-30位的数字字符串吗?

将其设置为2个15位数字,并将其转换为2个64位整数?还是浮动?

只需使用每个数字的二进制表示形式,就可以轻松地将30个字符串压缩到15个字节。例如,1592可以表示为一系列四位值,如下所示:

0001 0101 1001 0010
当以两个四位值分组时,可以用标准ASCII表示为
§tt


此外,如果字符串包含许多相同的连续数字,则可以实现的变体。

一个明显的解决方案是将它们“压缩”为二进制数字表示,而不是字符串表示。参见问题示例库。

将其分解为几个未签名的整数

“9347692367596047327509604839”

变成:


9 347692367 596047327 509604839

我肯定会选择最简单的解决方案,只需将它们存储为整数(大小合适,可以是32位、64位或128位,视需要而定)。使用支持字符的算法对其进行压缩将浪费大量空间,因为每个字符必须容纳10个以上的不同值(0-9)。

假设可以使用浮点数,则可能会有11个符号:

[0,1,2,3,4,5,6,7,8,9,.]

这意味着每个符号需要4位。3位最多只能代表8个符号。您可以轻松地使用每个符号4位,并获得大量压缩

如果您的字符串中只有整数,一个简单的解决方案是将其转换为十六进制,并且您仍然可以使用每个符号4位,同时获得更好的压缩比。(因为没有16个符号的浪费位)


如果使用哈夫曼压缩,将获得最佳比特/每符号比。你可以

压缩数字最常用的方法之一是使用。它的工作原理是,如果你知道第一个数字是x,并且后面的数字相对相似,你可以将后面的数字编码为(x+c1),(x+c2),等等


在这个方案中,只需对完整的x值编码一次,如果c值小于x值,则可以节省大量空间。您还可以使用一个版本,首先对数字进行排序,然后您的增量指最后看到的数字,而不是一个数字。使用此方法,您可以更有效地覆盖更大范围的数字。

不,它们不是浮点数。你能再解释一下答案吗?谢谢。如果使用C字符串,请小心。数字0可能是个问题,因为C字符串以null结尾。这不如将整个字符串表示为大整数有效。4位可以表示16个不同的值,因此此表示浪费了6/16=37.5%的分配空间。+1。二进制编码十进制(BCD)虽然不是最优的,但却是一个很好的第一个解决方案。它将存储成本降低了50%,并且只增加了很少的运行时开销。存在的风险是,如果字符串最左边的子序列是一个或多个零,那么这些子序列将丢失在您的表示中。这是一个不错的主意,但20位数字不能放入64位整数中。尽管编写扩展整数解析之类的东西不是火箭科学,但它绝非微不足道。此外,这种转换将消除数字字符串中的任何前导零。当然,必须特别考虑前导零,但不清楚字符串是否可以包含并应该保留前导零。但是,请注意,我建议使用“合适的大小”,这意味着“足够大的东西来保存您的数据”:。争论仍然存在。只需使用存储值所需的任意多个n位单位。1) 存储任何前导零(如果您希望保留它们)2)读取可以存储在单元/字(32位、64位等)中的尽可能多的字符,并将它们存储在单元3)重复2)直到流结束。4) 将单位/单词用可读的方式包装,并选择与此方法相匹配的方式。谢谢你,布莱恩!在这种情况下,哈夫曼压缩是愚蠢的,因为几乎不可能得到一组对数字具有非接近最大熵的数字。这是一个比使用增量编码更好的建议,没有证据表明增量编码可以帮助他获得OP提供的信息。@BrianR.Bondy链接无法重定向到
www.
。。。