对等长C ++的字符串排序算法

时间:2014-09-09 03:11:13

标签: string algorithm sorting

我需要按字母顺序和长度排序大约100000个字符串,我按长度排序,将其放入字符串长度的2D向量中,然后使用quicksort(对于ASCIIbetically)对每个数组进行排序。但对于相同长度的字符串,是否有更快的排序?我听说基数很棒,但我觉得很难理解。不使用sort()函数排序等长字符串的最佳方法是什么?如果您需要代码我可以发布。

2 个答案:

答案 0 :(得分:2)

我认为构建一个trie,然后通过预先遍序遍历来检索trie中的密钥与字符串排序一样有效,并且实际上是一种基数排序。 Here是一篇详细的学术论文,讨论这种方法。在2006年,至少这是最快的字符串排序方法。

答案 1 :(得分:1)

对于8到15个字符的字符串,快速排序的比较函数可以在单个64位块中执行前8个字符。等等16到31等等。所以,你最终会得到尽可能多的比较函数。除非您有大量具有长公共子字符串的字符串,否则只需使用您对字符串长度的了解就可以直截了当。

为了完整性,您需要担心对齐和字节顺序。因此,一次取8个字节到uint64_t:

  uint64_t u ;

  memcpy(&u, pv, 8) ;
  ...convert to big-endian if required...

会做到这一点。我可以告诉你,在x86_64上使用gcc和-O2,memcpy()编译为单个指令,好像它是u = *(uint64_t*)pv :-)对于有对齐问题的处理器,我希望编译器做适合的东西。

可悲的是,memcmp(foo, bar, 8)没有得到相同的处理(至少在gcc 4.8上,甚至没有-O3): - (