首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >整数压缩法

整数压缩法
EN

Stack Overflow用户
提问于 2018-12-19 21:11:26
回答 2查看 1.2K关注 0票数 1

如何将一行整数压缩为较短的整数?

类似:输入:'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个数字吗?

EN

回答 2

Stack Overflow用户

发布于 2018-12-19 22:13:27

这里有一条路。首先,从每个小数字中减去一个。中的示例输入结果

代码语言:javascript
复制
0 1 3 4 2 4 1 2 0 1 2 3

现在将其视为整数的基-5表示形式。(您可以先选择最重要的数字,也可以选择最后一个。)计算二进制数,这意味着同样的事情。现在,您有了一个“压缩”小数字字符串的整数。既然你没有显示你自己的代码,我就在这里停下来。您应该能够轻松地实现这一点。

由于最多只有16个小数字,因此该算法的最大结果值将是5^16,即152,587,890,625。这符合38位。如果需要存储更小的数字,则将结果值转换为另一个较大的数字基数,例如2^162^32。前者将产生3个数字,后者将产生2个数字。

@SergGr在注释中指出,此方法没有显示编码的整数数。如果没有单独存储,这可能是一个问题,因为该方法不区分前导零和编码零。如果需要压缩中包含的整数数量,有几种处理方法。您可以要求最重要的数字为1 (第一个或最后一个数字取决于最重要的数字在哪里)。这会使位数增加一个,所以您现在可能需要39位。

下面是一个玩具的可变长度编码示例。假设我们要编码两个字符串:1 2 31 2 3 0 0。结果会有什么不同?让我们考虑两个基-5数字32100321。它们表示相同的值,但仍然让我们将它们转换为基本2,保留填充。

代码语言:javascript
复制
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添加到二进制表示中,这将是我们编码的值。

代码语言:javascript
复制
1 2 3 => 11010110 binary = 214 dec
1 2 3 0 0 => 1000001010110 binary = 4182 dec

有许多方法可以将这些值解码回来。其中最简单的(但不是最有效的)是首先通过计算floor(log5(encoded))计算基-5位数,然后删除顶部位,然后使用mod 5逐个填充数字,然后除以5操作。

显然,这种可变长度的编码总是会增加1位开销。

票数 3
EN

Stack Overflow用户

发布于 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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53859188

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档