找到与k个大元素相对应的值

时间:2018-10-21 18:23:13

标签: java external-sorting

我的问题是关于大文件中的数据。

我有一个采用这种格式的大文件-Primary_key Value( 例如:10000001 1     10000002 5     10000009 200等 我想在primary_key列中找到与k-大元素相对应的值。例如:如果k = 2,则应按照上述示例输出200和5。

由于它是一个很大的文件,因此我计划使用最小堆方法,并且我对此非常了解。但是,我的数据位于键值对中,我不知道如何在最小堆排序中使用它。

关于如何实现此目标的任何建议。非常感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

是的,您的方法是正确的,您可以使用优先级队列(带有最小堆)来实现此目的。您可以将数据存储在地图中,然后在如下所示的优先级队列中使用它。

PriorityQueue<Map.Entry<String, Integer>> pq = new PriorityQueue<>((a, b) -> a.getValue()-b.getValue());
//psuedo code
for (line in file)
{ 
    //line[0] - denotes key and line[1] - denotes value
    count = map.getOrDefault(line[0], 0);
    map.put(num, count+line[1]);
}
for(Map.Entry<Integer, Integer> entry : counterMap.entrySet()) {
    pq.offer(entry);
    if(pq.size() > k) 
     pq.poll();
}

List<Integer> res = new LinkedList<>();
while(!pq.isEmpty()) {
    res.add(0, pq.poll().getValue());
}
return res;