我有要求 - 1.在List / Array中有随机值,我需要找到3个最大值。 2.我有一个值池,每次更新此池可能每5秒钟一次,现在每次更新后,我都需要从列表池中找到3个最大值。
我想在列表中使用Math.max三次,但我不认为它 一种非常优化的方法。 的>不会有任何分拣机制成本高昂,因为我只担心顶级 3最大值,为什么要对所有这些进行排序
请在JAVA中建议最好的方法
答案 0 :(得分:4)
更新:FYI Guava有一个带有greatestOf
方法的Ordering类来获取集合中的n max个元素。您可能想要查看实现。
答案 1 :(得分:3)
遍历列表一次,保持到目前为止看到的三个最大元素的有序数组。每当您看到一个新元素时,这都很容易更新,并立即为您提供您正在寻找的答案。
答案 2 :(得分:1)
在这种情况下,priority queue应该是您需要的数据结构。
答案 3 :(得分:1)
首先,永远不要再说,“我不认为这是一种非常优化的方法。”在你将一个分析器放在它上面之前,你不会知道代码的哪一部分会让你失望。
其次,最简单的方法是做你想要做的事情 - 如果他们试图看看你的代码做什么,以后最明显的是使用Collections.sort()
并选择关掉最后三个要素。然后,任何看到代码的人都会知道,“哦,这段代码需要三个最大的元素。”清晰的代码有很多价值,它可能会超过你可能做过的任何优化。它还可以防止你编写错误,比如当有人将相同的数字放入列表两次时会发生什么,或者当列表中只有两个元素时给出有用的错误消息。
第三,如果你真的得到的数据太大而O(n log n)操作太慢,你应该重写一下保存数据的数据结构 - java.util.NavigableSet
例如offer一个.descendingIterator()
方法,你可以探测它的前三个元素,那将是三个最大数字。如果你真的想要,可以使用Heap数据结构,你可以用一个比较之类的东西来拉出前3个元素,代价是添加一个O(log n)过程。