我有一个包含大量元素的数组 - 超过2,000,000个。我需要获得最高(或最低)排名300元素。因此,每当我达到数组的第一个最高(或最低)300个元素时,返回它们。目前Arrays.sort用于整个数组,然后返回最高(或最低)的排名元素。
例如:{1,2,3,4,5,6,7,8,9}
我想获得最高的3个元素;我需要:{9,8,7}
对此有任何建议吗?
修改
迄今为止发现的最佳资源,包含对不同解决方案的研究/比较:
http://www.michaelpollmeier.com/selecting-top-k-items-from-a-list-efficiently-in-java-groovy/
文章的源代码:
答案 0 :(得分:4)
您可以使用部分heapsort
。构建具有minheap
元素的1st 300
。
然后在进一步遍历数组时,检查当前元素是否大于堆的根元素。如果它更大,则删除根元素并添加这个新元素。
完成整个阵列后,minHeap
将拥有最多的300个元素。
逐个提取根元素。元素将按升序弹出。
注意:无论N的值如何,堆都将始终包含k(300)个元素,因此在这种情况下堆操作应为O(logk)。
因此,此算法的复杂度顺序为O(Nlogk)
,其中N是数组的大小。
空间复杂性 - O(k)
编辑: 如果你想要最低的300个元素,那么可以使用maxheap而不是minheap来跟踪类似的算法。
答案 1 :(得分:0)
这对你有用吗?此示例对数组中的前4个元素进行排序:
double[] arr = new double[]{1.0,4.0,2.0,8.0,3.0,6.0,7.0,5.0};
int nth = 4; //e.g. - sort the top 4 numbers
Arrays.sort(arr,arr.length-nth-1,arr.length);
System.out.println(Arrays.toString(arr));
输出:
[1.0, 4.0, 2.0, 3.0, 5.0, 6.0, 7.0, 8.0]
答案 2 :(得分:-1)
使用(T[], int, int, java.util.Comparator),这将对指定范围内的给定数组(T[]
)进行排序,仅对第一个int arg
到第二个int arg
的元素进行排序。比较器是可选的。