最小堆法求top(k)问题

本文介绍了如何使用最小堆法来求解找到数据流中的最大K个数问题。首先,建立一个容量为K的最小堆,然后遍历数据流,每次将新元素与堆顶元素比较。如果新元素大于堆顶元素,则替换堆顶元素并调整堆。最后,堆中的元素即为最大的K个数。提供了一个代码示例作为思路参考。
摘要由CSDN通过智能技术生成

最小堆法
 这是一种局部淘汰法,先读取前 K 个数,建立一个最小堆,然后将剩余所有数字依次与最小堆的堆顶进行比较,如果小于或等于堆顶数据,就继续比较下一个;否则,删除堆顶元素,并将新数据插入堆中,重新调整最小堆。当遍历完全部数据后,最小堆的数据即为最大的K个数。

代码模拟(带注解,len和k值取得较小,仅做思路学习使用,问题里是无限流输入,可以使用STL的优先队列构建堆去维护,符合Leetcode 703. 数据流中的第K大元素的代码放在“算法与数据结构”的整理里):

#include<bits/stdc++.h>
using namespace std;
vector<int> num;
vector<int>::iterator it;

void getRand(vector<int>& nums, int len)
{
   
	srand((unsigned int)getpid());
	for(int i = 0; i < len; i++)
		nums.push_back(rand() % 1000);
}

void heapify(int *a, int i, int k)
{
   
	int minn = i;
	int l = i<<1;
	int r = i<<1|1;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值