【C++】用STL heap尋找最小的k個值

思路:
建立一個最大堆,如果新添加的元素小於堆頂元素,pop_heap出去堆頂元素,然後push_heap進去新添加的元素;否則,什麼也不用做。

同理,用STL heap尋找最小的k個值則需要建立最小堆,操作正好反過來。

注意:make_heap、pop_heap以及push_heap中的_Compare參數要保持一致,否則會失敗。


代碼實現(以“尋找最小的10個值”爲例):

#include<iostream>
#include<vector>
#include<algorithm>
#include <time.h> 
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;
}


參考:
https://blog.csdn.net/qq_29630271/article/details/66478256

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章