如何将一行整数压缩为较短的整数?
类似:输入:'1,2,4,5,3,3,3,3,3,3,4‘->算法->输出:'X,Y,Z’
能从另一个角度把它拿回来吗?('X,Y,Z‘-> '1,2,4,5,5,3,3,2,3,4')注:输入只包含介于1-5之间的数字,总字符串为10-16,我能把它压缩成3-5个数字吗?
发布于 2018-12-19 22:13:27
这里有一条路。首先,从每个小数字中减去一个。中的示例输入结果
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位。
下面是一个玩具的可变长度编码示例。假设我们要编码两个字符串: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有一个110000110100的基-2表示,所以这个数字的二进制表示被填充到相同的大小。
请注意,不需要填充第一行,因为最大的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位开销。
发布于 2022-01-22 22:38:20
它的电话:polidatacompressor.js,但是许可证要花你的钱,你必须向作者询问价格LOL。
https://github.com/polidatacompressor/polidatacompressor
Ncomp(65535)将输出: 255,255,当以字节的形式存储在数据库中时,将得到2个字符。
另一种方法是在javascript (1231).toString(16)中使用“十六进制”(十六进制),在压缩字符为-1的情况下,在60%的情况下给出'4cf‘。
或使用base10进行base64 https://github.com/base62/base62.js/ 4131 --> 14D 413131 -> 1Jtp
https://stackoverflow.com/questions/53859188
复制相似问题