例如。如果我们有两个字符串 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.
但是,有没有更优雅的方法来做到这一点?
例如。如果我们有两个字符串 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.
但是,有没有更优雅的方法来做到这一点?
将数字转换为字符串时,确保所有字符串的长度相同,必要时在前面附加 0。所以 2 和 10 将被编码为“02”和“10”。
虽然 kjampani 的解决方案在普通应用程序中可能是最好和最简单的,但另一种更节省空间的方法是在每个字符串前面加上自己的长度。当然,您需要以一种一致排序的方式对长度进行编码。
如果您知道所有字符串都很短,您可以将它们的长度编码为固定长度的 base-X 序列,其中 X 是您愿意使用的字符代码数(常用值是 64、96、255 和256.) 请注意,您必须按字典顺序使用字符代码,因此正常的 base64 将不起作用。
一种可变长度的保序编码是 UTF-8 使用的编码。(不是直接使用 UTF-8,它有一些会妨碍的极端情况,但相同的编码技术。UTF-8 的顺序保留属性有时非常有用。)此类压缩代码的全部范围可以编码长达 42 位的值,平均每个字节有 5 个有效负载位。这对于相当长的字符串来说已经足够了;4 TB 长的字符串在野外非常罕见;但如果您需要更长的时间,也可以通过将大小前缀扩展超过一个字节。
将字符串分解为连续的字母和数字子字符串,然后通过将每个子字符串作为整数进行比较(如果它是数字字符串)进行排序
“aaa2” ---> aaa + 2
“aaa1000” ---> aaa + 1000
aaa == aaa
由于它们是平等的,我们继续:
1000 > 2
因此,aaa1000 > aaa2。