排序长字符串列表的最佳方法

时间:2010-06-18 20:51:37

标签: string sorting

我想知道根据时间和空间效率对一长串字符串进行排序的最佳方法。我更喜欢时间效率而不是空间效率。

字符串可以是数字,字母,字母数字等。我对排序行为不感兴趣,比如字母数字排序v / s字母排序只是排序本身。

我能想到的一些方法。

  1. 使用代码ex:.Net framework的Arrays.Sort()函数。我认为它的工作方式是计算字符串的哈希码,并使用二进制搜索将字符串插入到正确的位置。

  2. 使用数据库(例如:MS-sql)。我没有这样做。我不知道这会有多高效。

  3. 使用类似trie的前缀树数据结构。排序需要使用DFS(深度优先搜索) - O(| V | + | E |)时间遍历特里树的所有trieNodes。 (搜索需要O(l)时间,其中l是要比较的字符串的长度。)

  4. 任何其他方式或数据结构?

4 个答案:

答案 0 :(得分:1)

您说您有一个数据库,并且可能是字符串存储在数据库中。然后你应该让数据库为你做的工作。它可能能够利用索引,因此不需要对列表进行实际排序,而只需按排序顺序从索引中读取它。

如果没有索引,数据库可能仍然可以帮助您。如果你只获取一些小常数k的前k行,例如100.当你使用带有LIMIT子句的ORDER BY时,它允许SQL Server使用一个名为TOP N SORT的特殊优化,它在线性时间内运行,而不是O(n log(n))时间。

如果您的字符串不在数据库中,那么您应该使用.NET提供的功能。我认为你不太可能编写比默认排序快得多的自定义代码。

答案 1 :(得分:1)

我发现this paper使用trie数据结构来有效地对大量字符串进行排序。我没有仔细研究它。

答案 2 :(得分:0)

如果字符串不是很长,

Radix sort也可能是不错的选择,例如名单

答案 3 :(得分:0)

假设您有一个很大的字符串列表,并且List的长度为N.

使用基于比较的排序算法(如MergeSort,HeapSort或Quicksort)将为您提供enter image description here

其中n是列表的大小,d是列表中所有字符串的最大长度。

在这种情况下,我们可以尝试使用Radix排序。设b为基数,让d为最大字符串的长度,然后我们可以显示使用基数排序的运行时间为enter image description here

此外,如果字符串是小写英文字母,则运行时间为O(n*d+26d)

资料来源:MIT Opencourse Algorithms讲座由教授。 Eric Demaine。