【C++】用STL heap寻找最小的k个值

发布时间:2023-12-28 12:00

思路:
建立一个最大堆,如果新添加的元素小于堆顶元素,pop_heap出去堆顶元素,然后push_heap进去新添加的元素;否则,什么也不用做。

同理,用STL heap寻找最小的k个值则需要建立最小堆,操作正好反过来。

注意:make_heap、pop_heap以及push_heap中的_Compare参数要保持一致,否则会失败。


代码实现(以“寻找最小的10个值”为例):

#include
#include
#include
#include  
using namespace std;


int RandomInRange(int start, int end) {
	if (start >= end) {
		throw new std::exception(\"error\");
	}

	return rand() % (end - start + 1) + start;
}

int main()
{	
	vector<int> vec(10, INT_MAX);
	vector<int> vec2;
	int t;

	srand((unsigned)time(NULL));

	make_heap(vec.begin(), vec.end()); // 建立一个最大堆

	for (int i = 0; i < vec.size()*10; ++i) {
		t = RandomInRange(1,1000); // 随机生成1~1000范围的数字
		vec2.push_back(t);

		// 选出最小的k个数
		if (t < vec[0]) {
			pop_heap(vec.begin(), vec.end()); // 把顶端元素放到了数组的最后
			vec[vec.size() - 1] = t; 
			push_heap(vec.begin(), vec.end()); // 把数组最后的元素调整到合适位置
		}
	}
	
	sort(vec2.begin(), vec2.end());
	
	return 0;
}


思路2:
还可以用priority_queue实现最大堆、最小堆。参考https://blog.csdn.net/lym940928/article/details/89635690


参考:
https://blog.csdn.net/qq_29630271/article/details/66478256
https://blog.csdn.net/lym940928/article/details/89635690

ItVuer - 免责声明 - 关于我们 - 联系我们

本网站信息来源于互联网,如有侵权请联系:561261067@qq.com

桂ICP备16001015号