从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个实数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<=1000000),数组中n个元素S 1, S 2, S 3, S 4 … S n(-32768 ≤ S x ≤ 32767) 我们定义函数sum(i,j...

N个数中找出最大的K个数

题目描述: 有很多个(N个)无序的数,我们姑且假定它们各不相等,怎么选出其中最大的若干个(k个)数呢? 1.N=100, K = 10的时候怎么处理? 2. N=1000, K = 100呢? ...

N个数里面找出最大的k个数

题目:给出N个无序的数,然后找出其中最大的k个数 解题思路:          首先测试数据有可能会有一亿个数,数据量特别的大,数据库不可能存储这么多的数据。如果直接sort排序,NlogN时间复...

java最小堆实现优先权队列和求最大的n个数问题

堆在实现优先权队列和求最大最小的n个数问题上,有这莫大的优势! 对于最大堆和最小堆的定义此处不再赘述,课参考网上文章:http://blog.csdn.net/genios/article/detai...

【算法导论学习-012】n个数随机等概率的抽样m个

n个数随机等概率的抽样m个,提供了4种方案的算法。
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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