java - 在 Java 中,在多线程程序中保留前 100 项的最佳方法是什么?

标签 java multithreading sorting

我正在运行 Java 8,我的应用程序是一个多线程搜索程序。它有数百个线程;每个线程都会进行一些计算并获得带有分数的结果,并且所有线程将其结果放入 vector 中。但我不想保存所有结果,因为有数百万个结果,太多了,而且我只对分数 [0 - 100] 为 80 或更高的结果感兴趣,而且我只想收集结果中的前 100 个,所以现在在我的应用程序中我有一个大小为 100 的 vector 。如果其中的项目少于 100 个,则只需添加到其中,当其中有 100 个项目时,请执行以下操作:

myVector.set(99,result);
Collestions.sort(myVector);

因此,最后一个项目总是得分最低,如果新项目得分较高,则最后一个项目将被替换。 我想知道这种方法是否是最好的,并且是最快的?还有其他更好的吗?

最佳答案

最快的方法是使用 heap (如果是多线程,请确保它是 synchronized 版本)。堆允许您在日志时间内添加元素,也可以在日志时间内删除最小的元素。

堆的 Java 实现是 PriorityQueue ,或者,对于同步版本, PriorityBlockingQueue 。就您而言,您需要 PriorityBlockingQueue<Integer> .

工作的方法是有一个方法,将可能的东西添加到堆中(即,分数为 80+ 的东西),然后

  1. 统计堆中有多少个元素,如果小于100,则添加该元素;否则:
  2. 查看堆中的最小元素(恒定时间操作)并将其与您正在考虑添加的元素进行比较;
  3. 如果这个分数比当前最小值更高,则删除该最小值(log n 运算),然后在(log n 运算)中添加这个新分数。

在此过程结束时,您的堆将包含前 100 个顶部元素,您可以从堆中一一读​​取这些元素(按照从最小到最大的顺序,只需继续删除最小值)。

(顺便说一句,这种堆与另一种堆无关,后者为新对象分配内存。计算机科学中的两个关键概念具有相同的名称,这有点不幸。)

关于java - 在 Java 中,在多线程程序中保留前 100 项的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26414660/

相关文章:

java - SQLException : ResultSet closed

java - 尝试填充 BST 中的数组时如何通过递归方法保持计数

java - 动态设置 View 的背景颜色

javascript - 取消 JavaScript 中的定时循环?

c - 多线程的最佳方式?

java - 内存重新排序如何帮助处理器和编译器?

sorting - 使用 Kotlin 按多个条件排序

java - Android Studio for 循环问题

C语言 : Why my code get infinite loop and how to use recursion to solve Merge Sort problem?

C++如何将排序的 vector 合并到排序的 vector 中/从所有 vector 中弹出最少的元素?