繁体   English   中英

"整数压缩法"

[英]Integer compression method

如何将一行整数压缩成更短的内容?

喜欢:输入:'1 2 4 5 3 5 2 3 1 2 3 4' -> 算法 -> 输出:'XYZ'

并且可以反过来取回它吗? ('XYZ' -> '1 2 4 5 3 5 2 3 1 2 3 4') 注意:输入将只包含 1-5 之间的数字,数字的总字符串将是 10-16 有什么办法可以压缩它到3-5个数字?

这是一种方法。 首先,从每个小数字中减去一个。 对于您的示例输入结果

0 1 3 4 2 4 1 2 0 1 2 3

现在将其视为整数的以5为基数的表示形式。 (您可以选择第一个或最后一个最高有效数字。)以二进制形式计算表示相同含义的数字。 现在,您有了一个整数,可以“压缩”少量数字的字符串。 由于您没有显示自己的代码,因此我就在这里停止。 您应该能够轻松实现此目标。

由于您最多有16个小数字,因此该算法的最大结果值为5^16 ,即152,587,890,625 这适合38位。 如果您需要存储比此小的数字,请将结果值转换为另一个更大的数字基数,例如2^162^32 前者将导致3个数字,后者将导致2个数字。


@SergGr在注释中指出,此方法未显示已编码整数的数量。 如果未将其分开存储,则可能会出现问题,因为该方法无法区分前导零和编码零。 如果需要压缩中包含的整数数量,可以通过多种方法来解决。 您可能要求最高有效位为1 (第一个或最后一个取决于最高有效位在哪里。)这将位数增加了一个,因此您现在可能需要39位。

这是可变长度编码的一个示例 假设我们要编码两个字符串: 1 2 31 2 3 0 0 结果将如何不同? 让我们考虑两个以5为底的数字32100321 它们表示相同的值,但仍然让我们将其转换为以2为基数,并保留填充。

1 + 2*5 + 3*5^2 = 86 dec = 1010110 bin
1 + 2*5 + 3*5^2 + 0*5^3 + 0*5^4 = 000001010110 bin

第二行中的那些附加0表示最大的5位数以5为底的数字44444以2为底的表示形式为110000110100因此该数字的二进制表示被填充为相同的大小。

注意,不需要填充第一行,因为最大的3位以5为底的数字444具有以1111100为底的2表示,即长度相同。 对于初始字符串3 2 1在这种情况下也将需要填充,因此即使高位数字不是0 ,也可能需要填充。

现在,将最高有效的1添加到二进制表示中,这将是我们的编码值

1 2 3 => 11010110 binary = 214 dec
1 2 3 0 0 => 1000001010110 binary = 4182 dec

有很多方法可以将这些值解码回去。 一种最简单(但不是最有效)的方法是,首先通过计算floor(log5(encoded))计算以5为基数的位数,然后删除最高位并使用mod 5逐位填充数字并除以5次操作。

显然,这种可变长度的编码总是恰好增加了1位开销。

它的调用: polidatacompressor.js ,但许可证可能会花费你,因为你必须向作者询问价格

https://github.com/polidatacompressor/polidatacompressor

Ncomp(65535) 将输出:255, 255 并且当您将其作为字节存储在数据库中时,您将获得 2 个字符

另一种方法是在 javascript (1231) 中使用“Hexadecimal aka base16”。toString(16) 在 60% 的情况下为您提供 '4cf',它将字符压缩为 -1

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM