我在大量数据上使用Java。
[我尝试尽可能简化问题]
实际上,我有一个小类(元素),其中包含一个int KEY和一个双WEIGHT(带有getters&setters)。
我从文件中读取了很多这些对象,并且我必须获得最好的(最重的)M个对象。
实际上,我正在使用带有比较器的PriorityQueue来比较两个Element,它可以工作,但是速度太慢。
您知道(我知道您这样做)任何更快的方法吗?
谢谢
最佳答案
基于堆的优先级队列是解决此问题的良好数据结构。就像进行完整性检查一样,请验证您是否正确使用了队列。
如果您想要重量最大的项目,请使用最小队列-其中堆的顶部是最小的项目。将每个项目添加到max-queue并在完成后检查最重要的M
项目效率不高。
对于每个项目,如果队列中的M
项目少于M
,则添加当前项目。否则,请查看堆的顶部。如果小于当前项目,则将其丢弃,然后添加当前项目。否则,丢弃当前项目。处理完所有项目后,队列将包含Queue
权重最高的项目。
有些堆具有用于替换堆顶部的快捷方式API,但是Java的ojit_code没有。即使这样,big-O的复杂性是相同的。