我在大量数据上使用Java。

[我尝试尽可能简化问题]

实际上,我有一个小类(元素),其中包含一个int KEY和一个双WEIGHT(带有getters&setters)。

我从文件中读取了很多这些对象,并且我必须获得最好的(最重的)M个对象。

实际上,我正在使用带有比较器的PriorityQueue来比较两个Element,它可以工作,但是速度太慢。

您知道(我知道您这样做)任何更快的方法吗?

谢谢

最佳答案

基于堆的优先级队列是解决此问题的良好数据结构。就像进行完整性检查一样,请验证您是否正确使用了队列。

如果您想要重量最大的项目,请使用最小队列-其中堆的顶部是最小的项目。将每个项目添加到max-queue并在完成后检查最重要的M项目效率不高。

对于每个项目,如果队列中的M项目少于M,则添加当前项目。否则,请查看堆的顶部。如果小于当前项目,则将其丢弃,然后添加当前项目。否则,丢弃当前项目。处理完所有项目后,队列将包含Queue权重最高的项目。

有些堆具有用于替换堆顶部的快捷方式API,但是Java的ojit_code没有。即使这样,big-O的复杂性是相同的。

09-04 23:17