【问题标题】:Efficient string sorting algorithm高效的字符串排序算法
【发布时间】:2011-10-21 19:20:46
【问题描述】:

通过比较对字符串进行排序(例如标准的 QuickSort + strcmp 类函数)可能有点慢,尤其是对于共享公共前缀的长字符串(比较函数需要 O(s) 时间,其中 s 是字符串的长度) ,因此标准解决方案的复杂度为 O(s * nlog n)。有没有已知的更快的算法?

【问题讨论】:

  • 它是否会导致您的代码变慢?如果没有,请不要担心。
  • 我不是第一次遇到这个问题,但是是的,目前这种排序是我的程序花费大量时间的一部分。

标签: string algorithm sorting quicksort strcmp


【解决方案1】:

如果您知道字符串仅包含某些字符(几乎总是如此),您可以使用BucketSortRadixSort 的变体。

【讨论】:

  • 我做了一个混合解决方案,首先使用快速排序对字符串的后缀进行排序,然后使用基数排序对其余的后缀进行排序。它工作得非常快。我不想使用纯基数排序,因为有些字符串很长,但后缀相当不同,所以使用快速排序对它们进行排序并没有什么坏处。我认为还有改进的余地,但现在这个解决方案已经足够了。谢谢
【解决方案2】:

你可以建立一个trie,我相信应该是O(s*n)

【讨论】:

  • @tyz:插入树应该是O(s),你需要这样做n次。
  • 我不得不考虑一下,在直接实现中它似乎有点内存。
  • @Piotr:目前,您的问题仅涉及计算复杂性。其他问题,例如内存复杂性或缓存效率通常可能占主导地位!
【解决方案3】:

请搜索“Sedgewick Multikey quick sort”(Sedgewick 用 C 和 Java 编写了著名的算法教科书)。他的算法相对容易实现并且速度相当快。它避免了您在上面谈论的问题。有声称更快的突发排序算法,但我不知道任何实现。

有一篇文章Fast String Sort in C# and F# 描述了该算法,并引用了 Sedgewick 的代码以及 C# 代码。 (披露:这是我根据 Sedgewick 的论文编写的文章和代码)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-02
    • 1970-01-01
    相关资源
    最近更新 更多