整数压缩方法

时间:2018-12-19 21:11:26

标签: database algorithm math integer compression

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

赞:  输入:'1 2 4 5 3 5 2 3 1 2 3 4'->算法->输出:'X Y Z'

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

1 个答案:

答案 0 :(得分:3)

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

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位。 / p>

这是一个 可变长度编码的玩具示例 。假设我们要编码两个字符串: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位开销。