如何将数字编码为字符串,以使生成的字符串的字典顺序与数字顺序的顺序相同

时间:2012-10-05 17:59:34

标签: algorithm lexicographic

例如。如果我们有两个字符串2和10,如果我们按字典顺序排序,则10将首先出现。

非常简单的解决方案是重复一个角色n。

eg. 2 can be encoded as aa

10 as aaaaaaaaaa

This way the lex order is same as the numeric one.

但是,有更优雅的方法吗?

3 个答案:

答案 0 :(得分:6)

将数字转换为字符串时,请确保所有字符串具有相同的长度,如果需要,可在前面添加0。所以2和10将被编码为" 02"和" 10"。

答案 1 :(得分:3)

虽然kjampani的解决方案在正常应用程序中可能是最好和最简单的,但另一种节省空间的方法是在每个字符串前面加上自己的长度。当然,您需要以一致的方式对长度进行编码。

如果您知道所有字符串都很短,您可以将它们的长度编码为固定长度的基数X序列,其中X是您愿意使用的字符代码的数量(流行值为64,96 ,255和256.)请注意,您必须按字典顺序使用字符代码,因此普通的base64将无效。

一个可变长度顺序保留编码是UTF-8使用的编码。 (不是直接使用UTF-8,它有一些角落情况会妨碍,但是相同的编码技术.UTF-8的顺序保留属性偶尔会非常有用。)这种压缩代码的全部范围都可以编码长度最多为42位的值,每个字节平均有5个有效负载位。这对于相当长的琴弦来说足够了;四条TB的长弦在野外非常罕见;但是如果你需要更长的时间,也可以通过将大小前缀扩展到多个字节来实现。

答案 2 :(得分:-1)

将字符串分成连续的字母和数字子字符串,然后通过将每个子字符串作为整数进行排序(如果它是数字字符串)

“aaa2”---> aaa + 2

“aaa1000”---> aaa + 1000

aaa == aaa

由于它们是平等的,我们继续:

1000> 2

因此,aaa1000> aaa2。