从n个数中提取出最大的m个数的算法与采用stl的实现

原创 2015年11月18日 18:47:07

      经常会在面试中被问及如下的算法问题:

问题:在n个数中寻找最大的m个数

解决的办法:经网上查找,说采用堆排序是最优的解决算法,算法如下:

【算法伪代码】
      0-建立一个最小堆(优先队列),最小堆的大小控制在m之内
      1-for 每个数:
      2-----if 这个数比最小堆的堆顶元素大:
      3---------弹出最小堆的最小元素
      4---------把这个数插入到最小堆
      5-最小堆中的m个元素就是所要求的元素
      6-其中最小堆的作用就是保持里面始终有m个最大元素,且m个元素中最小的元素在堆顶.
【算法复杂度】O(nlogm) 遍历O(n) 最小堆O(logm)
【其他】如果要求n个数中取最小的m个,只要把算法反一下即可


  正好在今天的工作中遇到了这个问题:从一篇新闻的若干条评论中选择出点赞数最高的10条评论,恰好是n中找m个最大的问题。


示例代码如下:

#include <iostream>
#include <algorithm>
#include <vector>
#include <iterator>
#include <time.h>
using namespace std;

bool desc_cmp(int a,int b)
{
	return a > b; 
}

int main(int argc, char *argv[])
{
	vector<int> val, val2, val3;
	vector<int>::iterator it;
	int m =5, n = 50, t;

	cout<<"产生的随机数如下:"<< endl;
	srand(time(NULL));
	for (int i = 0; i < n; i ++) 
	{
		t = rand()%100;
		val2.push_back(t);
		val3.push_back(t);
		cout << t << " ";
	}
	cout <<endl;

	for (int i = 0; i < n; i ++) 
	{
		int t = val2[i];
		if (val.size() < m) 
		{
			val.push_back(t);
			push_heap(val.begin(), val.end(),desc_cmp);
			continue;
		}

		if (t > val[0])
		{
			pop_heap(val.begin(), val.end(),desc_cmp);
			val[m - 1] = t;
			push_heap(val.begin(), val.end(),desc_cmp);
		}
	}

	cout << "采用大顶堆取得最大的前 " << m << "个数是:" << endl;
	for (int i = 0; i < m; i ++)
		cout << val[i] << " ";
	cout << endl;

	cout << "采用stl::sort排序后的结果是:" << endl;
	sort(val3.begin(), val3.end(),desc_cmp);
	for (int i = 0; i < val3.size(); i ++)
		cout << val3[i] << " ";
	cout << endl;

	return 0;
}


n个整数中找出连续m个数加和是最大Java版

即上一篇Python版取连续加和最大的整数后,本篇博客带来Java版取连续加和最大的整数。总体的思路入上一次博客中所述,就不在过多的阐述,关键就在于如何应用Java API写出相同逻辑的代码。 ...

UVA714给出n个数分成m个部分,使和最大的最小

这题,小白书上有讲,所以当时也没多想直接二分,分完之后,发现有问题,他说前面的尽量小,这里就要贪心, 从后面贪心,只要和值不大于二分的值就一直二分,然后发现还是不对,看了别人的,忽略了一个问题,二分...

给定n个实数x1,x2,...,xn,求这n个实数在实轴上相邻2个数之间的最大差值M,要求设计线性的时间算法

最大间隙问题。 要求线性时间算法。需要使用桶排序。桶排序的平均时间复发度是O(N).如果桶排序的数据分布不均匀,假设都分配到同一个桶中,最坏情况下的时间复杂度将变为O(N^2). 以下引用其他人的...

HDU 1024 Max Sum Plus Plus求前n个数中的若干个数分为连续的m段的最大和值(解析)

HDU 1024 Max Sum Plus Plus求前n个数中的若干个数分为连续的m段的最大和值(解析)...

[ACM] n个数分为m部分,要求每部分的和乘起来积最大(区间DP)

A - 爱管闲事 春希非常爱管闲事,他每天都会抽空帮助一些同学,由于春希非常死板,出于公平性,春希不会先帮助后来找他的同学。 现在有n个同学需要他的帮助,虽然他很想一天之类帮助所有人,...

1486【动态规划★★】Max Sum Plus Plus.(求n个数m个不相交子段的最大和)

题目描述给你一个长度为n的数组(1

贪心算法---n个数连接得到最小或最大的多位整数

设有n个正整数,将他们连接成一排,组成一个最大的多位整数。例如:n=3时,3个整数13,312,343,连成的最大整数为:34331213 又如:n=4时,4个整数7,13,4,246连接成的最...

网易面试题之小易是一个数论爱好者,并且对于一个数的奇数约数十分感兴趣。一天小易遇到这样一个问题: 定义函数f(x)为x最大的奇数约数,x为正整数。 例如:f(44) = 11. 现在给出一个N,需要求

小易是一个数论爱好者,并且对于一个数的奇数约数十分感兴趣。一天小易遇到这样一个问题: 定义函数f(x)为x最大的奇数约数,x为正整数。例如:f(44) = 11. 现在给出一个N,需要求出 f(1)...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:从n个数中提取出最大的m个数的算法与采用stl的实现
举报原因:
原因补充:

(最多只允许输入30个字)