压缩Base 62(0-9a-zA-Z)编码的字符串

时间:2013-07-16 07:53:22

标签: algorithm encoding compression

我需要将一个长度为20个字符的base62(0-9a-zA-Z)编码字符串压缩成15-16个字符的字符串,以便挤入其他一些信息。棘手的部分是压缩输出应该也是base62编码。可以这样做吗?任何建议都非常感谢。

谢谢!

1 个答案:

答案 0 :(得分:3)

参见Pigeonhole principle - 如果你试图将100只鸽子放入10洞,一些洞将有多只鸽子。同样,对于您的问题,必须出现两个字符串压缩到相同的字符串。在这些情况下,您将不知道将压缩字符串解压缩到哪个字符串。

所以不,你不能losslessly以相同的编码为所有可能的输入压缩20个字符到16个字符(甚至20到19个字符)。


如果输入具有一些定义特征,例如唯一的大写字符将是第一个字符,最后3个字符是数字出现的位置等,那么它将更具可压缩性并且可能是可能的

如果您具有此类特征(或者如果要转换为具有足够空间的其他编码),则可以轻松地将任何编码中的字符串转换为唯一编号,然后将此编号转换为不同编码的字符串。这样做的方法是:

  • 对于每个字符位置,从0开始,为该位置允许的每个可能字符指定一个数字。

    因此,如果在第一个位置允许“A”到“Z”和“a”到“z”,你可以通过“Z”分配0-25到“A”,通过“Z”分配到26-51到“a” “Z”。例如,“B”将为1。

  • 迭代字符串,将总数乘以当前位置的允许值数,然后将分配给该位置的字符的数字加到总数中。

要获得不同的编码,只需重复:

  • 将总数除以总计除以当前位置允许值的数量(向下舍入)。
  • 将当前位置设置为与上述分区的其余部分对应的字符。

如果您在上述任何一种情况下从左到右或从右到左,只要选择一种方式并坚持下去就没关系。

您还可以通过计算每个编码的最大可能值(通过获取每个字符的最大值)来轻松确定是否可以进行此类转换 - 如果目标具有较小的最大可能值,则无法进行转换。

请注意,上述内容仅适用于某些位置具有固定值的情况,尽管您可以在某种程度上将其扩展为适用于其他编码(例如字符串中最多包含1个数字),但这会有所帮助更复杂。

示例:

  

输入格式: 1个大写字母(A-Z),然后2个数字(0-9)
  输出格式: 1个小写字母(a-z),然后是2个大写/小写字母(A-Z或a-z)
  输入:“Z35”
  数量: 10 *(10 *(26 * 0 + 25)+ 3)+ 5 = 2535
  说明:我们以“Z”开头,总数为0开始,我们乘以大写字母数(26)然后加上“Z”(25)的值。然后我们转到“3”,我们将这个总数乘以数字(10)并添加“3”(3)的值,依此类推。
  输出计算:
  2535/26 = 97
  2535%26 = 13,所以第一个字符=“n”(13 + 1 =第14个字母)
  97/52 = 1
  97%52 = 45,所以第2个字符=“t”(45-26 + 1 =字母表的第20个字母)
  1%52 = 1,所以第3个字符=“B”
  输出“ntB”

     

输入格式的最大可能值: 10 *(10 *(26 * 0 + 25)+ 9)+ 9 = 2599
  输出格式的最大可能值: 52 *(52 *(26 * 0 + 25)+ 51)+ 51 = 70303
  可以转换吗?是的,因为70303> = 2599。