最有效的排序算法,适用于大量数字

时间:2009-06-05 03:40:01

标签: algorithm list sorting performance numbers

我正在开展一个大型项目,我不打算在这里总结一下,但项目的这一部分是采用一个非常大的文本文档(最少约50,000个单词(不是唯一的)),以及按照最常用的顺序输出每个唯一的单词(可能前三个将是“a”“an”和“the”)。

我的问题当然是,最好的排序算法是什么?我正在阅读计数排序,我喜欢它,但我担心的是,与独特单词的数量相比,值的范围会太大。

有什么建议吗?

9 个答案:

答案 0 :(得分:14)

首先,您需要一张单词地图 - >计数。 50,000字不多 - 它很容易适合记忆,所以没什么好担心的。在C ++中,您可以使用标准STL std :: map。

然后,一旦有了地图,就可以将所有地图键复制到矢量中。

然后,使用自定义比较运算符对此向量进行排序:不是比较单词,而是比较地图中的计数。 (不要担心特定的排序算法 - 您的数组不是那么大,因此任何标准库排序都适合您。)

答案 1 :(得分:3)

我从quicksort开始,然后从那里开始。

查看wiki page on sorting algorithms,了解差异。

答案 2 :(得分:2)

您应该尝试MSD radix排序。它会在lexicographical order中对您的条目进行排序。这是您可能感兴趣的google code project

答案 3 :(得分:1)

看一下链接。关于不同算法如何工作的图示表示。这会给你一个提示!

Sorting Algorithms

答案 4 :(得分:1)

对于这个特殊问题,你可以获得比quicksort更好的性能,假设如果两个单词出现的次数相同,那么输出它们的顺序无关紧要。

第一步:创建一个哈希映射,其中包含键值和频率作为关联值。在解析文件时,您将填充此哈希映射。在执行此操作时,请务必跟踪遇到的最高频率。这一步是O(n)复杂性。

第二步:创建一个列表,其条目数等于第一步中的最高频率。此列表中每个插槽的索引将包含频率计数等于索引的字的列表。因此,文档中出现3次的单词将列在列表[3]中。迭代哈希映射并将单词插入列表中的相应位置。这一步是O(n)复杂性。

第三步:反向遍历列表并输出所有单词。这一步是O(n)复杂性。

总体而言,此算法将在 O(n)时间而非快速排序所需的O(nlogn)中完成您的任务。

答案 5 :(得分:1)

在我测试的几乎所有情况下,Quicksort都为我做了最好的工作。但是,我确实有两个案例,其中Combsort是最好的。可能是因为代码太小,或者由于数据排序方式有些怪癖,因此在这些情况下,combsort更好。

任何时候排序显示在我的个人资料中,我会尝试各种各样的。我从未有过任何高于Quicksort和Combsort的东西。

答案 6 :(得分:0)

我想你想做一些事情,如下面的帖子所述:

http://karephul.blogspot.com/2008/12/groovy-closures.html

支持闭包的语言使得解决方案变得非常简单,就像Eric提到的LINQ一样。

答案 7 :(得分:0)

对于大型集合,您可以在信息检索中使用所谓的“基于排序的索引”,但对于50,000个单词,您可以使用以下内容:

  • 将整个文件读入缓冲区。
  • 解析缓冲区并使用构建令牌向量 struct token {char * term,int termlen; } term是指向缓冲区中单词的指针。
  • 按术语(词典顺序)对表格进行排序。
  • 设置entrynum = 0,遍历术语向量, 当term是new时,将其存储在向量中: struct {char * term; int频率; }在index entrynum,将频率设置为1并增加条目号,否则增加频率。
  • 按频率按降序对矢量进行排序。

答案 8 :(得分:0)

您还可以尝试实现也称为Trie的数字树。这是link