将许多数字压缩成字符串

时间:2014-06-22 08:06:13

标签: algorithm compression

我想知道是否有办法将20个左右的大数字(~10 ^ 8)压缩成合理长度的字符串。例如,如果数字存储为十六进制并连接,则长度至少为160个字符。我想知道是否有一种聪明的方法来压缩数字并让它们退出。我正在考虑将序列0-9作为参考,并让输入字符串的一部分为<1024的数字。该号码将被转换为二进制,用作掩码,即指示号码中存在哪些数字。现在还不清楚从哪里开始。

还有更好的选择吗?

由于

4 个答案:

答案 0 :(得分:0)

如果这些大数字的字节数相同,并且您总是知道这些数字的数量,那么有一种简单的方法可以做到。你只需拥有一个字节数组,而不是将它们作为整数读出来,而是将它们作为字符读出来。您是在试图模糊您的价值观还是只是打包它们以便轻松转移?

答案 1 :(得分:0)

当我将很多值压缩成一个可逆的String时,我通常会进行base 64转换。这实际上可以从String中截取相当多的长度,但请注意,在表示它时可能会占用相同的内存。

实施例

这个十进制数字:

10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

是Base 64中的以下内容:

Yki8xQRRVqd403ldXJUT8Ungkh/A3Th2TMtNlpwLPYVgct2eE8MAn0bs4o/fv1bmo4oUNQa/9WtZ8gRE7IG+UHX+LniaQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA

为什么你不能做到这么太极端

想一想。假设你有一些长度10。并且您希望使用5个字符来表示该数字,因此需要50%速率压缩方案。首先,我们计算出您可以使用10数字代表多少个可能的数字..这是..

2^10 = 1024

好的,没关系。我们可以用5 digits表达多少个数字:

2^5 = 32

因此,您只能使用5显示 32个不同的数字,而您可以使用1024位显示10个数字。要使压缩起作用,需要在压缩值和提取值之间进行一些映射。让我们试着让映射发生..

Normal - Compressed
0        0
1        1
2        2
..       ...
31       31
32       ??
33       ??
34       ??
...      ... 
1023     ??

大多数可以用扩展值表示的数字没有映射。

这称为Pigeonhole Principle,在此示例中,n的值大于m的值,因此我们需要将压缩值中的值映射到一个正常值,这使事情变得异常复杂。 (感谢Oli提醒我)

答案 2 :(得分:0)

你需要更多地描述你的意思&#34; string&#34;和&#34; ~10 ^ 8&#34;。你的&#34;字符串&#34;包含任何字节序列?或者它是否仅限于可能的字节子集?如果是这样,它究竟是如何受到限制的?您&#34;大数字的限制是什么?#34;?它们代表什么?

最多10个 8 的数字可以用27位表示。如果允许任何字节序列,则它们中的20个将是540位,其可以存储在68字节的字符串中。如果字符串的内容有限,则需要更多位。如果您的数字范围较大,则需要更多位。

答案 3 :(得分:0)

当然,这取决于你的输入。但是有可能以这种方式构建(非常)紧凑的表示。