java – 在无限列表中查找最高的N个数字
发布时间:2020-12-15 05:12:25 所属栏目:Java 来源:网络整理
导读:我在最近的一次 Java访谈中被问到了这个问题. Given a List containing millions of items,maintain a list of the highest n items. Sorting the list in descending order then taking the first n items is definitely not efficient due to the list siz
我在最近的一次
Java访谈中被问到了这个问题.
以下是我所做的,如果有人能提供更高效或更优雅的解决方案,我会很感激,因为我相信这也可以使用PriorityQueue来解决: public TreeSet<Integer> findTopNNumbersInLargeList(final List<Integer> largeNumbersList,final int highestValCount) { TreeSet<Integer> highestNNumbers = new TreeSet<Integer>(); for (int number : largeNumbersList) { if (highestNNumbers.size() < highestValCount) { highestNNumbers.add(number); } else { for (int i : highestNNumbers) { if (i < number) { highestNNumbers.remove(i); highestNNumbers.add(number); break; } } } } return highestNNumbers; } 解决方法
您不需要嵌套循环,只需保持插入并在集合太大时删除最小的数字:
public Set<Integer> findTopNNumbersInLargeList(final List<Integer> largeNumbersList,final int highestValCount) { TreeSet<Integer> highestNNumbers = new TreeSet<Integer>(); for (int number : largeNumbersList) { highestNNumbers.add(number); if (highestNNumbers.size() > highestValCount) { highestNNumbers.pollFirst(); } } return highestNNumbers; } 相同的代码也应该与PriorityQueue一起使用.在任何情况下,运行时应该是O(n log highestValCount). 附:正如在另一个答案中指出的那样,您可以通过跟踪最低数量来避免不必要的插入,从而进一步优化(以可读性为代价). (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |