我正在运行 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+ 的东西),然后
- 统计堆中有多少个元素,如果小于100,则添加该元素;否则:
- 查看堆中的最小元素(恒定时间操作)并将其与您正在考虑添加的元素进行比较;
- 如果这个分数比当前最小值更高,则删除该最小值(log n 运算),然后在(log n 运算)中添加这个新分数。
在此过程结束时,您的堆将包含前 100 个顶部元素,您可以从堆中一一读取这些元素(按照从最小到最大的顺序,只需继续删除最小值)。
(顺便说一句,这种堆与另一种堆无关,后者为新对象分配内存。计算机科学中的两个关键概念具有相同的名称,这有点不幸。)
关于java - 在 Java 中,在多线程程序中保留前 100 项的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26414660/