从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;
}


m个数随机取n个数的java实现

//借用他人的C语言版本改成java版本 同时懒懒地增加了顺序输出结果    static int total = 0;    static void cur(int k, int m, in...
  • denygod
  • denygod
  • 2016年04月14日 11:25
  • 990

python实现n个数中选出m个数

某页纸上有一个数列A,A包含了按照从小到大的顺序排列的多个自然数,但是因为一些原因,其中有M个连续的位置看不清了。这M个数左边最小的数是X,右边最大的数是Y,这些数之和大于等于P且小于等于Q。 #请写...
  • Kangyucheng
  • Kangyucheng
  • 2017年12月01日 22:09
  • 656

从n个无序的数中选出m个最大数

从n个无序的数中选出m个最大数
  • JIEJINQUANIL
  • JIEJINQUANIL
  • 2016年05月27日 16:11
  • 3261

N个数取m个数的全排列非递归

全排序的非递归实现
  • lin200753
  • lin200753
  • 2014年05月31日 15:25
  • 1242

java:n个数中取出m个数,计算之和为S,求这几个数

背景: 现在的生活,越来越看重算法,有一天开了很多票,却只报了一部分; 也忘了报了几张,原来也不照相,只记了一个数, 算了,写个程序吧,一个一个试呗,递归算法; 来,看例子:// 判断数组b对...
  • u014624241
  • u014624241
  • 2016年10月25日 17:56
  • 1291

数的组合问题,从n个数中选出m个数,结果按照字典序排列

数的组合问题,从n个数中选出m个数,结果按照字典序排列 数的组合问题。从1,2,…,n中取出m个数,将所有组合按照字典顺序列出。如n=3,m=2时,输出:12 13 23 思想:每个数的选择都有可能...
  • l1078530758
  • l1078530758
  • 2017年09月04日 01:18
  • 377

合算法:从m个数中选n个数的所有组合

#include using namespace std; int combine(int a[], int n, int m) { m = m > n ? n : m; int* or...
  • q277055799
  • q277055799
  • 2014年08月25日 04:32
  • 2382

随机数算法之从N个数中取M个数

算法描述如下:从M个数中选出N个数来(0 分两种情况: 1.n>>m时   repeat          Randomize;                   //初始化随机...
  • crazyhacking
  • crazyhacking
  • 2012年10月11日 21:08
  • 2506

从n个数选出最大的m个的算法比较

n×m遍扫描 【算法基本描述】n×m遍扫描 【算法思想】每次都扫描一遍数组,取出最大元素,这样扫描m遍就能得到m个最大的数 【算法复杂度】O(nm) 2.排序后取最大m个数 【算法基本描述】对...
  • qq_17612199
  • qq_17612199
  • 2016年04月20日 19:46
  • 2164

从长度为M的无序数组中找出N个最大的数

1、将数组前N个数调整成最小堆 2、堆顶元素值依次与第N个元素以后的每个元素进行比较 3、若堆顶元素值小,则将堆顶元素重新赋值为新元素的值,并且将前N个数重新调整为最小堆;否则判断下一个元素 4...
  • mashuangwe
  • mashuangwe
  • 2017年08月08日 21:26
  • 118
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:从n个数中提取出最大的m个数的算法与采用stl的实现
举报原因:
原因补充:

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