Top/k之最大/最小问题

本文介绍了一种利用优先级队列(小根堆)高效寻找海量数据中最小n个数值的方法。通过实例演示了如何随机生成大量数据,并从中筛选出最小的10个数值。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

海量数据中找最大值/最小值问题

解题思路:通过优先级队列(小跟堆)的队头是最小的来与vec中的数据比较来找最小的n个数。

 int _tmain(int argc, _TCHAR* argv[])
 {
	 
	/*
	请定义一个vector<int> vec;
	以系统时间为种子,
	随机产生1-1000000之间的整数100000个,添加到vector
	当中,

	请找出vec当中,值最小的前10个元素的值并打印出来
	*/
	 vector<int> vec;
	 srand(time(0));
	
	 for (int k = 0; k < 100000; ++k)
	 {
		 vec.push_back(rand() % 100000 +1);
	 }
	 priority_queue<int, vector<int>,less<int>> que;//小跟堆
	 for (int k = 0; k < 10; ++k)
	 {
		 que.push(vec[k]);
	 }
	 for ( int k = 10; k < vec.size(); ++k)
	 {
		 if (vec[k] < que.top())
		 {
			 que.pop();
			 que.push(vec[k]);
		 }
	 }
	 while (!que.empty())
	 {
		 cout << que.top() << endl;
		 que.pop();
	 }
}
 

运行结果:

 

将大于号改成小于号同时使用大跟堆。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值