.net 哪种排序算法能够最快地提供一页结果?(部分结果集)

.net 哪种排序算法能够最快地提供一页结果?(部分结果集),.net,sorting,quicksort,heapsort,.net,Sorting,Quicksort,Heapsort,我有一个“大”数据集,需要在其中显示第一行或最后10行数据,并允许排序操作在用户查看第一页结果时在后台运行 编辑:详细说明“大”的含义 我正在将多台主机的系统日志和事件日志数据收集到一个可搜索的存储库中。由于我将查看N台以不同间隔突发/垃圾邮件事件日志数据的计算机,因此我搜索的项目如果不是以默认顺序Machine\log\event DateTime 根据我收到的答案,我可以在插入数据时填充二级索引,以便初始视图非常有效 我认为,首先对所有数据进行排序,然后交付整个结果集是低效的,因为80%的时

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

编辑:详细说明“大”的含义

我正在将多台主机的系统日志和事件日志数据收集到一个可搜索的存储库中。由于我将查看N台以不同间隔突发/垃圾邮件事件日志数据的计算机,因此我搜索的项目如果不是以默认顺序
Machine\log\event DateTime

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

我认为,首先对所有数据进行排序,然后交付整个结果集是低效的,因为80%的时间用户只关心前10个条目或最后10个条目

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

堆、快速排序和shell似乎提供了最好的性能,并且可能提供一页开箱即用的结果

我如何判断这些算法何时准备好为第一页服务?我要看什么

基于此示例,堆、快速排序和shell似乎提供了 最好的性能,并可能提供一页的结果 盒子

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

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

基于此示例,堆、快速排序和shell似乎提供了 最好的性能,并可能提供一页的结果 盒子

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


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

查找前K个项目可以在O(nlogk)时间内完成,这比O(nlogn)快得多,使用堆或最终使用优先级队列。 策略是浏览列表一次,在浏览的过程中,保留一个到目前为止发现的前k个元素的列表。为了有效地执行此操作,您必须始终知道top-k中最小的元素,因此您可以用较大的元素替换它。堆结构使维护此列表变得很容易,而不会浪费任何精力

您还可以使用中提到的选择算法来查找列表中前k个最小或最大的条目。这比对整个列表进行排序更快


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

查找前K个项目可以在O(nlogk)时间内完成,这比O(nlogn)快得多,使用堆或最终使用优先级队列。 策略是浏览列表一次,在浏览的过程中,保留一个到目前为止发现的前k个元素的列表。为了有效地执行此操作,您必须始终知道top-k中最小的元素,因此您可以用较大的元素替换它。堆结构使维护此列表变得很容易,而不会浪费任何精力

您还可以使用中提到的选择算法来查找列表中前k个最小或最大的条目。这比对整个列表进行排序更快


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

您可以在
O(n)
time中选择前K项。看见您可以使用Quickselect算法选择前10个(将它们放在数组的前面),再次选择后10个(放在数组的末尾),然后在后台运行排序,对项目10到n-10进行排序

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

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

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


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

您可以在
O(n)
时间中选择前K项。看见您可以使用Quickselect算法选择前10个(将它们放在数组的前面),再次选择后10个(放在数组的末尾),然后选择so