【问题标题】:Sorting Algorithms for strings of equal length C++等长字符串的排序算法 C++
【发布时间】:2014-11-02 08:59:07
【问题描述】:

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

【问题讨论】:

  • "ASCIIbetically" - 不错 :-)
  • 这是一件事,我发誓 =]
  • 我没有得到你想要达到的目标。也许一个简短的例子会有所帮助。
  • 好的,所以我们得到了大约 100000 个字符串,我们必须以尽可能最快的方式对这些字符串进行 n 次排序。所以说,“那块拼图更高”最终会成为“那块更高的拼图”。我只是在寻找一种更快的方法来以这种方式对字符串进行排序。
  • 你读过这篇文章吗:Engineering Radix Sort for Strings?在优化字符串的基数排序方面付出了很多努力。

标签: string algorithm sorting


【解决方案1】:

我认为构建一个trie,然后通过前序遍历检索树中的键与字符串排序一样有效,实际上是基数排序的一种形式。 Here 是讨论这种方法的详细学术论文。至少在 2006 年,这是目前最快的字符串排序方法。

【讨论】:

  • 目前,使用向量和快速排序对大约 70000 个字符串进行排序大约需要 0.38 秒。特里会打败它吗? (然后又取决于计算机)
  • 对不起,多出 0.38 秒
  • 有没有人有一些简单的 trie 示例代码可以看,甚至是伪代码?
【解决方案2】:

对于 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):-(

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-21
    • 1970-01-01
    • 2010-10-13
    • 1970-01-01
    • 2011-04-15
    • 2018-08-17
    • 1970-01-01
    相关资源
    最近更新 更多