我想在fortran 90中选择一个数组中的10个最大值(size~1e9个元素)。最有效的方法是什么?我正在研究有效的排序算法,它是要走的路吗?我需要对整个阵列进行排序吗?
答案 0 :(得分:5)
对10个 9 元素进行排序从顶部选择10 1 听起来像一个过度杀伤:log 2 N因子将是大约30,并且排序过程会移动大量数据。
为结果创建一个包含十个项目的数组,用大数组中的前十个元素填充它,并对10个元素数组进行排序。现在从元素11开始遍历大数组。如果当前元素大于10元素数组中的最小项,找到插入点,移动十元素数组以为新元素腾出空间,并将其放入阵列。完成大数组后,小数组包含十个最大值。
对于“较大的十分之一”,您可以通过切换到max-heap data structure来获得显着的性能提升。从大数组的前十个项构造一个堆;存储最小的数字以供将来参考。然后对于堆中最小数字上方的大数组中的每个数字,到目前为止执行以下操作:
完成后,堆将包含大数组中的十个最大项目。
答案 1 :(得分:0)
不需要排序。您只需要一个大小为10的优先级队列,成本为O(n),而最佳排序为O(nlogn)。
答案 2 :(得分:0)
不,您不需要执行完整排序。只要您知道它们只包含那些最大的10个项目,或者没有任何项目,您就可以删除输入数组的部分内容。
例如,您可以调整快速排序算法,使您只递归处理覆盖第10和第11个最高项之间边界的分区。最终,您将在10个最后位置获得10个最大的项目(不一定按价值排序)和下面的所有其他项目(也不是按顺序排列)。
无论如何在悲观情况下(错误的枢轴选择或太多相等的项目)可能需要太长时间。
最好的解决方案是将大数组传递给10项优先级队列,正如@ {J63在the answer中提到的那样。