Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 压缩基62(0-9a-zA-Z)编码字符串_Algorithm_Encoding_Compression - Fatal编程技术网

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

Algorithm 压缩基62(0-9a-zA-Z)编码字符串,algorithm,encoding,compression,Algorithm,Encoding,Compression,我需要将长度为20个字符的base62(0-9a-zA-Z)编码字符串压缩为15-16个字符的字符串,以便压缩其他信息。棘手的部分是压缩输出也应该是base62编码的。这能做到吗?非常感谢您的任何建议 谢谢 请参见-如果您尝试将100只鸽子放入10个洞中,有些洞将有多只鸽子。同样,对于您的问题,必须出现两个字符串压缩为同一个字符串的情况。在这些情况下,您将不知道将压缩字符串解压缩到哪个字符串 因此,不能对所有可能的输入以相同的编码压缩20到16个字符(甚至20到19个字符) 如果输入具有一些定

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

谢谢

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

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


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

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

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

    因此,如果第一个位置允许“A”到“Z”和“A”到“Z”,则可以将0-25分配给“A”到“Z”,将26-51分配给“A”到“Z”。例如,“B”将是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,所以第二个字符=“t”(45-26+1=20个字母)
1%52=1,所以第三个字符=“B”
输出:“ntB”

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


让它保持原样怎么样<代码>解码(编码数据)是身份功能,不是吗?目标字符串是ASCII还是例如16位unicode?不希望实现这一点。正如@H2CO3所说:“编码到压缩”将提供一个小的压缩提前,这将被“解码到base62”丢失。输出长度与输入长度相同。原始字符串是否为字母数字?base62编码是如何完成的?可以使用20字节的输出完成,但不能使用base62编码。基62中的20个字符表示需要20*(log62/log2)位对其进行编码。(这大约是120位=15字节)因此您可以将它们存储在15字节中。如果您可以存储20字节(而不是20个base62编码字符),则这是可能的。