Top/k之最大/最小问题

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

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

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

	请找出vec当中,值最小的前10个元素的值并打印出来
	*/
	 vector vec;
	 srand(time(0));
	
	 for (int k = 0; k < 100000; ++k)
	 {
		 vec.push_back(rand() % 100000 +1);
	 }
	 priority_queue,less> 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();
	 }
}
 

运行结果:

 Top/k之最大/最小问题_第1张图片

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

 

Top/k之最大/最小问题_第2张图片

你可能感兴趣的:(STL)