【发布时间】:2013-11-07 04:27:50
【问题描述】:
问题:
我想压缩一个非固定长度的非负整数数组(但它应该是 300 到 400),主要包含 0、一些 1、一些 2。虽然不太可能,但也有可能拥有更大的数字。
例如,这是一个包含 360 个元素的数组:
0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,1,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,2,0, 0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1 ,0,0,0,0,0,0, 0,0,4,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0, 0,1,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,1,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0 ,0,0,0,5,2,0,0,0, 0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,1,2,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0。
目标:
我们的目标是将这样的数组压缩成使用字母和数字的最短编码。理想情况下,类似:sd58x7y
我的尝试:
我尝试使用“增量编码”,并使用零来表示任何大于 1 的值。例如:{0,0,1,0,0,0,2,0, 1} 将表示为:2,3,0,1。要解码它,一个人将从左到右读取,并写下“2 个零,一个,3 个零,一个,0 个零,一个(这将添加到前一个,因此有一个 2),1 个零,一个”。
为了消除分隔符(逗号)的需要,从而节省更多空间,我尝试仅使用一个字母数字字符来表示 0 到 35 的增量值(使用 0 到 y),同时将字母 z 保留为“35 PLUS the下一个字符”。我认为这被称为“变量位”或类似的东西。例如,如果一行中有 40 个零,我会将其编码为“z5”。
据我所知...生成的字符串仍然很长(在上面的示例中大约有 20 个字符)。理想情况下,我想要8个字符甚至更短的东西。谢谢你的时间;任何帮助或灵感将不胜感激!
【问题讨论】:
-
能出现的数字值有上限吗?值 128975 可以存在于某个位置吗?
-
不,任何大于 5 的值的可能出现实际上是不可能的。因此,虽然 128975 可能存在,但如果它确实存在我会没问题,并将结果字符串设为 100000 个字符长。
-
您是否可以压缩数据以适应“短”字符串将在很大程度上取决于该数据的稀疏程度。如果您的 360 项数组有 360 个从 0 到 15 的随机值,那么您不太可能将其压缩到 180 字节以下。
-
一个包含 90% 0 和 10% 1 的列表怎么样?我觉得肯定有一些我不知道的众所周知的方法......
-
使用 LZW 压缩然后转换为base64 以创建可读的字符串。
标签: algorithm compression