我正在编写词典编纂软件,理论上可能需要使用任意(字典项目特定)排序对数万个字符串进行排序。有两种指定自定义归类的方法:
比较字符串的天真方法是检查字形到字形,直到找到不匹配,然后查找校对键以查找不匹配的字素进行比较,但我希望有一种更有效的方法
我到目前为止最好的想法取决于注意到相等长度的字符串可以被视为little-endian base-n数字,所以我可以为每个字符串预先计算一个整数键,将整理变为廉价整数比较。但是,这会破坏不同长度的字符串(排序字典时很重要),并且对可生成的整数大小没有限制。 为了解释长度差异,我想我可以计算每个字符串的所有前缀的密钥列表,然后只比较长度等于被比较的较短字符串的前缀的密钥。这似乎做得很好,但密钥大小仍然无限制,存储密钥可能会占用大量内存。
有没有办法改进这种方法?或者我只是完全错了,并且有一个更好的方法来排序任意排序的字符串?
答案 0 :(得分:2)
一个字母素数基数排序怎么样?你得到Big O n(单词数)* m(最长单词的长度)排序。这个想法应该相当简单,将所有以A开头的单词放在A桶中,将B开头放在B桶中,依此类推单词中的字符。
答案 1 :(得分:1)
我不是专家,但我可能会建议天真的方法和你的方法之间的某种混合。在每个字符串中查看固定数量的字节时,将其视为小端数字并使用预先计算的排序规则。然后,如果他们是相同的移动到下一组相同的长度,并做同样的事情。棘手的部分是处理可变长度的字素(例如UTF-8或有向图)。最简单的解决方案是在字典中使用固定宽度表示,但可能还有另一个更复杂的解决方案,我现在想不到。
一旦到达较短字符串的末尾,就将其展开以满足下一个边界,然后进行比较。
您还可以查看归类的开源实现,看看它们是否做了更复杂的事情(例如strcoll C函数的GNU实现)。