什么排序算法以最快的速度提供一页结果? (部分结果集)

时间:2011-12-29 21:20:15

标签: .net sorting quicksort heapsort

我有一个“大”数据集,我需要显示第一行或最后10行数据,并允许排序操作在用户查看结果的第一页时在后台运行。

  

修改:有关“大”的含义的详细信息

     

我正在将几个主机的Syslog和EventLog数据收集到可搜索的存储库中。由于我将查看以不同间隔突发/垃圾邮件事件日志数据的N台计算机,如果它不是Machine\Log\Event DateTime

的默认顺序,我搜索的项目可以快速增长      

根据我收到的答案,我可以在插入数据时填充辅助索引,以便初始视图非常有效。

我认为首先对所有数据进行排序,然后在用户只关心第一个或最后10个条目的80%时间内提供整个结果集是低效的。

提供部分结果集并在后台继续处理的最佳算法是什么?

Based on this sample,堆,快速排序和shell似乎提供了最佳性能,可能会提供一页开箱即用的结果。

如何准备好为第一页提供服务?我会看什么门槛?

3 个答案:

答案 0 :(得分:1)

您可以在O(n)时间内选择前K项。见http://en.wikipedia.org/wiki/Selection_algorithm#Selecting_k_smallest_or_largest_elements。您可以使用Quickselect算法选择前10个(将它们放在数组的前面),再次为底部10(放在数组的末尾),然后在后台运行排序,排序项目10到n-10。

实际上,当您要选择的项目数少于项目总数的1%时,Heapselect比Quickselect更快。也就是说,从k列表中选择n项,如果k < n/100,则应使用Heapselect。如果k为10且n为百万,则Heapselect将比Quickselect快得多。

Heapselect的缺点是需要额外的O(k)空间。但是当k == 10时,这不是什么大问题。

这取决于数据的性质。如果要显示的总行数通常超过1,000,则应使用Heapselect。否则,请使用Quickselect。它们都很容易实现。

有关两种选择算法之间差异的更多信息,请参阅When Theory Meets Practice

答案 1 :(得分:0)

  

基于此示例,堆,快速排序和shell似乎提供   最好的表现,并可能提供一页的结果   框。

为此,您需要一种按顺序对列表进行排序的算法。列表的每次迭代都会将列表中的下一个最大(或最小)元素放置在适当的位置。因此,在第一次传递之后,最小元素位于位置1,而在第二次传递之后第二个最小元素位于位置2.为此,您将需要类似于选择排序] 2之类的东西。

与其他算法和数据顺序相比,这是一个问题,这些问题可以大大超越。因此,即使您在排序后“快速”获取前10个记录,另一个算法可能会在相同的时间内对整个列表进行排序。

答案 2 :(得分:0)

查找前K个项目可以在O(nlogk)时间内完成,这比O(nlogn)快得多,使用堆或最终优先级队列。 策略是遍历列表一次,然后在保持列表中列出迄今为止找到的前k个元素。要有效地执行此操作,您必须始终知道此top-k中的最小元素,因此您可以将其替换为更大的元素。堆结构使得维护此列表变得容易,而不会浪费任何精力。

您还可以使用http://en.wikipedia.org/wiki/Selection_algorithm中提到的选择算法来查找列表中的前k个最小或最大条目。排序整个列表的速度更快。

我建议您先排序k个条目并显示结果,然后使用合并,堆或快速排序对其余条目进行排序。