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

标签 algorithm encoding compression

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

谢谢!

最佳答案

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

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


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

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

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

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

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

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

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

在上述任何一种情况下,无论从左到右还是从右到左,都没有关系,只要选择一种方式并坚持下去即可。

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

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

示例:

Input format: 1 uppercase letter (A-Z), then 2 digits (0-9)
Output format: 1 lowercase letter (a-z), then 2 upper-/lowercase letters (A-Z or a-z)
Input: "Z35"
Number: 10*(10*(26*0 + 25) + 3) + 5 = 2535
Explanation: We start with "Z", the total is 0 to start, which we multiply by the number of uppercase letters (26) and then add the value for "Z" (25). We then move on to "3", where we multiple this total by the number of digits (10) and add the value for "3" (3), and so on.
Output calculation:
2535 / 26 = 97
2535 % 26 = 13, so 1st character = "n" (13+1 = 14th letter of alphabet)
97 / 52 = 1
97 % 52 = 45, so 2nd character = "t" (45-26+1 = 20th letter of alphabet)
1 % 52 = 1, so 3rd character = "B"
Output: "ntB"

Largest possible value for input format: 10*(10*(26*0 + 25) + 9) + 9 = 2599
Largest possible value for output format: 52*(52*(26*0 + 25) + 51) + 51 = 70303
Is conversion possible? Yes, because 70303 >= 2599.

关于algorithm - 压缩 Base 62(0-9a-zA-Z) 编码字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17670977/

相关文章:

java - 使用 Spring @RequestParam 无法在 Controller 中获取 '#' 符号

PHP 修剪和空间不起作用

java - 我怎样才能在java中压缩一个字符串?

java - 有没有人得到压缩来使用 ASmack

PHP 表单提交 UTF-8

algorithm - 使用 IIR 滤波器进行图像处理有什么缺点吗?

algorithm - 不理解“算法设计手册”中的最接近启发式对

string - 如何编写一个接受字符串并返回最长有效子字符串的方法

openssl - ECDSA:如何使用 openssl 从解压缩 x 中获取 y 坐标

Python 嵌套循环 - 无输出