【问题标题】:Array with large number of elements sort only largest n elements [duplicate]具有大量元素的数组仅对最大的n个元素进行排序[重复]
【发布时间】:2014-07-17 22:03:15
【问题描述】:

我有一个包含大量元素的数组——超过 2,000,000 个。我需要获得最高(或最低)排名的 300 个元素。因此,每当我到达数组的第一个最高(或最低)300 个元素时,就返回它们。目前Arrays.sort用于整个数组,然后返回最高(或最低)排名的元素。

e.g.:{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/

文章源代码:

https://github.com/mpollmeier/Selection-Algorithms

【问题讨论】:

  • 查看其他sort methods
  • 您只想对前 300 个元素进行排序?还是您只想要最高/最低的 300 个?
  • Arrays#sort(Object[] array, int fromIndex, int toIndex)。阅读您正在使用的类/库上的 javadoc 和可用方法。
  • @Rossiar 300 最高/最低
  • @LuiggiMendoza - 我阅读了 javadoc,我的解释是错误的......我实际上只需要数组的前 N ​​个最高元素。

标签: java arrays algorithm sorting


【解决方案1】:

您可以使用部分heapsort。构造一个具有1st 300 元素的minheap

然后当你进一步遍历数组时,检查当前元素是否大于堆的根元素。如果更大,则删除根元素并添加这个新元素。

完成整个数组后,minHeap 将拥有最大的 300 个元素。

一一提取根元素。元素会按升序弹出。

注意:无论 N 的值如何,堆总是包含 k(300) 个元素,因此在这种情况下,堆操作应该是 O(logk)。

因此该算法的复杂度顺序为O(Nlogk),其中 N 是数组的大小

空间复杂度 - O(k)

编辑: 如果您想要最少的 300 个元素,则可以使用 maxheap 而不是 minheap 来遵循类似的算法。

【讨论】:

  • 我认为是n log n,而不是n;空格是n,因为你可以就地排序
  • @guido minHeap 只有 300 个元素。所以这种情况下的堆操作是常数时间。
  • 你需要看最坏的情况,也就是n log n;在堆中的插入是 log n
  • @guido 为什么说是nlogn?在恒定大小的堆中插入是恒定的。
  • @LuiggiMendoza 很抱歉,我真的看不出我错在哪里。我并不是说你知道 N 的值(数组的大小)。但是您知道所需的顶部元素的数量(300 或 k)。由于堆的大小始终为 k(而不是 N),因此如果 k 为常量,则操作应为 log(k) 或常量。
【解决方案2】:

使用(T[], int, int, java.util.Comparator),这将在指定范围内对给定数组(T[])进行排序,仅对从第一个int arg到第二个int arg的元素进行排序。比较器是可选的。

【讨论】:

  • OP不想对数组的前300个元素进行排序,他想获得最大的300个元素。
【解决方案3】:

这对你有用吗?此示例对数组中的前 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]

【讨论】:

    猜你喜欢
    • 2021-08-06
    • 1970-01-01
    • 1970-01-01
    • 2020-04-22
    • 1970-01-01
    • 2017-08-25
    • 2018-03-08
    • 1970-01-01
    • 2010-09-15
    相关资源
    最近更新 更多