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

Algorithm 将许多数字压缩成一个字符串,algorithm,compression,Algorithm,Compression,我想知道是否有办法将20个左右的大数字~10^8压缩成一个长度合理的字符串。例如,如果数字存储为十六进制并连接在一起,则长度至少为160个字符。我想知道是否有一种聪明的方法来压缩这些数字,然后再把它们取出来。我在考虑使用一个序列0-9作为参考,如果这些大数字的字节大小相同,那么让输入字符串的一部分成为一个数字,如果您总是知道这些数字的计数,那么有一种简单的方法可以做到这一点。您只需要拥有一个字节数组,而不是将它们作为整数读取,而是将它们作为字符读取。您是在试图混淆您的值,还是只是将它们打包以便轻

我想知道是否有办法将20个左右的大数字~10^8压缩成一个长度合理的字符串。例如,如果数字存储为十六进制并连接在一起,则长度至少为160个字符。我想知道是否有一种聪明的方法来压缩这些数字,然后再把它们取出来。我在考虑使用一个序列0-9作为参考,如果这些大数字的字节大小相同,那么让输入字符串的一部分成为一个数字,如果您总是知道这些数字的计数,那么有一种简单的方法可以做到这一点。您只需要拥有一个字节数组,而不是将它们作为整数读取,而是将它们作为字符读取。您是在试图混淆您的值,还是只是将它们打包以便轻松传输?

当我将许多值压缩到一个可逆字符串中时,我通常使用base 64转换。这实际上可以从字符串中截取相当多的长度,但请注意,表示字符串时可能会占用同样多的内存

范例

此数字以十进制表示:

10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
在Base 64中有以下内容:

Yki8xQRRVqd403ldXJUT8Ungkh/A3Th2TMtNlpwLPYVgct2eE8MAn0bs4o/fv1bmo4oUNQa/9WtZ8gRE7IG+UHX+LniaQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
为什么你不能做到这一点太极端了

想一想。假设你有一个长度为10的数字。你想用5个字符来表示这个数字,所以是一个50%的压缩率方案。首先,我们计算出你可以用10位数字表示多少个可能的数字。。那就是

2^10 = 1024
好的,没关系。我们可以用5位数字表示多少个数字:

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

Normal - Compressed
0        0
1        1
2        2
..       ...
31       31
32       ??
33       ??
34       ??
...      ... 
1023     ??
大多数可由扩展值表示的数字都没有映射


这被称为,在这个例子中,n的值大于m的值,因此我们需要将压缩值映射到多个正常值,这使得事情非常复杂。谢谢你提醒我。

你需要更详细地描述你所说的字符串和~10^8是什么意思。您的字符串可以包含任何字节序列吗?还是仅限于可能字节的子集?如果是,具体如何限制?你的大数字有什么限制?它们代表什么

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

将所有数字作为字符串存储到marisa trie: Base64生成的trie字典
当然,这在很大程度上取决于你的投入。但通过这种方式可以构建一个非常紧凑的表示

加密和压缩是两种不同的东西,你在问什么?如果是压缩,答案是这是不可能的,一般来说。@OliCharlesworth我应该问的是压缩而不是加密。为什么压缩通常是不可能的?因为鸽子洞原理。这里的“字符串”是什么?它是一个可打印字符序列,还是一个字节序列?每个字符允许哪些值?一般的解决方案是用基本数字来表示输入值,每个字符有不同的值。然后我提供的理论会很好地工作,并且会更小,然后将数字作为字符串处理。这有助于传输,但我只想缩短字符串的长度。谢谢你的解释。我的主要目标不是减少内存使用,而是简单地减少长度。那么base64可能是一个很好的方法。它将其减少了很多,您可以在原始数字和base64编码版本之间进行映射。我可能做错了什么:我正在使用对您的输入进行编码,但结果是MTAWMDAWMDAWMDAWMDAWMDAWMDAWMDAWMDAWMDAWMDAWMDAWMDAW…而不是从字符串转换它,将其解释为一个数字:对于某些输入数据,可以选择处理周期的最小化trie。然后是那个提尔。看看我的答案。
Normal - Compressed
0        0
1        1
2        2
..       ...
31       31
32       ??
33       ??
34       ??
...      ... 
1023     ??