TopK问题

本文介绍了如何利用优先队列解决寻找100亿个数字中前1000大数字的问题,并通过示例解释了算法思路,包括获取所有数对、将数对放入优先队列以及取出前k个数对的过程。
摘要由CSDN通过智能技术生成

TopK问题(优先队列):

例如下面这道题就有两种解法:

给定 100 亿个数字, 找出其中前 1000 大的数字

 1. 用一个数组保存刚才的数字, 直接在这个数组上建一个大堆, 循环 1000 次进行取栈顶元素 + 调整操作, 得到前 1000 大(要考虑内存)

 2. 先取集合中的前 1000 个数字, 构成一个小堆(堆顶元素就是前 1000 大元素的守门员). 再一个一个遍历集合中的数字,
    依次和守门员进行比较, 遇到大于守门员的元素, 就把守门员删掉, 把这个元素入堆, 并且调整堆
    当所有元素都遍历完成后, 堆中的元素就是前 1000 大的元素

例题:

题目描述:

给定两个以升序排列的整形数组 nums1 和 nums2, 以及一个整数 k。

定义一对值 (u,v),其中第一个元素来自 nums1,第二个元素来自 nums2。

找到和最小的 k 对数字 (u1,v1), (u2,v2) … (uk,vk)。

示例:

输入: nums1 = [1,7,11], nums2 = [2,4,6], k = 3
输出: [1,2],[1,4],[1,6]
解释: 返回序列中的前 3 对数:
[1,2],[1,4],[1,6],[7,2],[7,4],[11,2],[7,6],[11,4],[11,6]

输入: nums1 = [1,1,2], nums2 = [1,2,3], k = 2
输出: [1,1],[1,1]
解释: 返回序列中的前 2 对数:
[1,1],[1,1],[1,2],[2,1],[1,2],[2,2],[1,3],[1,3],[2,3]

思路:
思路(采用第一种方法):
1. 获取到所有的数对
2. 把数对放到优先队列里
3. 从优先队列里取前 k 个即可

代码实现:

import java.util.ArrayList;
import java.util.List;
import java.util.PriorityQueue;

class Pair implements Comparable<Pair>{
   
    public int n1;
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值