从N列表中查找K max值

时间:2012-03-30 10:56:19

标签: java

我有要求 - 1.在List / Array中有随机值,我需要找到3个最大值。 2.我有一个值池,每次更新此池可能每5秒钟一次,现在每次更新后,我都需要从列表池中找到3个最大值。

  

我想在列表中使用Math.max三次,但我不认为它   一种非常优化的方法。   的>不会有任何分拣机制成本高昂,因为我只担心顶级   3最大值,为什么要对所有这些进行排序

请在JAVA中建议最好的方法

4 个答案:

答案 0 :(得分:4)

  1. 对列表进行排序,获取3个最大值。如果您不想要排序费用,请迭代并维护n个最大值。
  2. 维护池是一个已排序的集合。
  3. 更新:FYI Guava有一个带有greatestOf方法的Ordering类来获取集合中的n max个元素。您可能想要查看实现。

    Ordering.greatestOf

答案 1 :(得分:3)

遍历列表一次,保持到目前为止看到的三个最大元素的有序数组。每当您看到一个新元素时,这都很容易更新,并立即为您提供您正在寻找的答案。

答案 2 :(得分:1)

在这种情况下,priority queue应该是您需要的数据结构。

答案 3 :(得分:1)

首先,永远不要再说,“我不认为这是一种非常优化的方法。”在你将一个分析器放在它上面之前,你不会知道代码的哪一部分会让你失望。

其次,最简单的方法是做你想要做的事情 - 如果他们试图看看你的代码做什么,以后最明显的是使用Collections.sort()并选择关掉最后三个要素。然后,任何看到代码的人都会知道,“哦,这段代码需要三个最大的元素。”清晰的代码有很多价值,它可能会超过你可能做过的任何优化。它还可以防止你编写错误,比如当有人将相同的数字放入列表两次时会发生什么,或者当列表中只有两个元素时给出有用的错误消息。

第三,如果你真的得到的数据太大而O(n log n)操作太慢,你应该重写一下保存数据的数据结构 - java.util.NavigableSet例如offer一个.descendingIterator()方法,你可以探测它的前三个元素,那将是三个最大数字。如果你真的想要,可以使用Heap数据结构,你可以用一个比较之类的东西来拉出前3个元素,代价是添加一个O(log n)过程。