将多个数字压缩成一个字符串



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

有更好的选择吗?

谢谢

如果这些大数的字节大小相同,并且您总是知道这些数的计数,那么有一种简单的方法可以做到这一点。您只需拥有一个字节数组,而不是将其作为整数读取,而是将其作为字符读取。你是在试图模糊你的价值观,还是只是把它们包装起来便于传递?

当我将很多值压缩成一个可逆的String时,我通常使用base 64转换。这确实可以从String中截断相当多的长度,但请注意,它可能占用同样多的内存来表示它。

示例

这个十进制数:

10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

在base64中如下:

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

为什么你不能这么做一个极端的水平

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

2^10 = 1024

好的,很好。我们可以用5 digits表示多少个数:

2^5 = 32

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

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

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

这就是所谓的鸽子洞原理,在这个例子中,n的值大于m的值,因此我们需要将压缩值映射到多个正常值,这使得事情变得非常复杂。(谢谢奥利提醒我)

您需要更详细地描述"string"one_answers"~10^8"的含义。你的"字符串"可以包含任何字节序列吗?或者它被限制在可能的字节子集中?如果有,它究竟是如何受到限制的?你的"大数字"的限制是什么?它们代表什么?

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

  • 将所有数字作为字符串存储到marisa trie中:https://code.google.com/p/marisa-trie/
  • Base64生成的trie字典

这当然很大程度上取决于你的输入。但是用这种方法构建一个(非常)紧凑的表示是有可能的。

相关内容

最新更新