我正在开展一个大型项目,我不打算在这里总结一下,但项目的这一部分是采用一个非常大的文本文档(最少约50,000个单词(不是唯一的)),以及按照最常用的顺序输出每个唯一的单词(可能前三个将是“a”“an”和“the”)。
我的问题当然是,最好的排序算法是什么?我正在阅读计数排序,我喜欢它,但我担心的是,与独特单词的数量相比,值的范围会太大。
有什么建议吗?
答案 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)
看一下链接。关于不同算法如何工作的图示表示。这会给你一个提示!
答案 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个单词,您可以使用以下内容:
答案 8 :(得分:0)
您还可以尝试实现也称为Trie的数字树。这是link