如何将整数行压缩为更短的内容?
赞: 输入:'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个数字?
答案 0 :(得分:3)
这是一种方法。首先,从每个小数字中减去一个。对于您的示例输入,会导致
0 1 3 4 2 4 1 2 0 1 2 3
现在将其视为整数的以5为基数的表示形式。 (您可以选择第一个或最后一个最高有效数字。)以二进制形式计算表示相同含义的数字。现在,您有了一个整数,可以“压缩”少量数字的字符串。由于您没有显示自己的代码,因此我就在这里停止。您应该能够轻松实现此目标。
由于您最多有16个小数字,因此该算法的最大结果值为5^16
,即152,587,890,625
。这适合38
位。如果您需要存储比此小的数字,请将结果值转换为另一个更大的数字基数,例如2^16
或2^32
。前者将导致3个数字,后者将导致2。
@SergGr在评论中指出,此方法未显示编码的整数数量。如果未将其分开存储,则可能会出现问题,因为该方法无法区分前导零和编码零。如果需要压缩中包含的整数数量,可以通过多种方法来解决。您可能要求最高有效位为1
(第一个或最后一个取决于最高有效位在哪里。)这将位数增加了一个,因此您现在可能需要39
位。 / p>
这是一个 可变长度编码的玩具示例 。假设我们要编码两个字符串:1 2 3
和1 2 3 0 0
。结果将如何不同?让我们考虑两个以5为底的数字321
和00321
。它们代表相同的值,但仍然让我们将其转换为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位开销。