用堆排序的思想求最小的k个数,处理海量数据

原创 2015年07月09日 22:11:50



//最小的k个数
//输入n个整数,输出其中最小的k个数
//解答:虽然利用快排的思想很好的解决了问题,但是也有限制,首先我们需要一次性读入所以的数据,其次,需要修改输入的数组
//利用堆排序来解决此问题,此种方法适合处理海量数据
//首先我们先读入k个元素创建一个大小为k的大根堆,然后我们依次读入剩下的数据,如果当前数据比大根堆的堆顶小,则用这个数代替当前
//堆顶,并调整堆使其保持大根堆的性质;如果当前数据比堆顶大,那么这个数不可能是最小的k个整数之一,故可以抛弃此数,此种方法的复杂度为O(nlogk)

#include<iostream>
using namespace std;
void AdjustDown(int *data,int i,int len)
{
	if(data==NULL||i<=0||len<=0||i>len)
		return;

	int nchild;
	for(;2*i+1<len;i=nchild)
	{
		nchild=2*i+1;
		if(nchild<len-1&&data[nchild+1]>data[nchild])
			nchild++;
		if(data[i]<data[nchild])
			swap(data[i],data[nchild]);
		else
			break;
	}
}
void BuildMax(int *a,int n)
{
	if(a==NULL||n<=0)
		return;

	for(int i=n/2-1;i>=0;i--)
		AdjustDown(a,i,n);
}
void main()
{
	int data[]={1,3,5,6,2,4,8,7};
	int len=sizeof(data)/sizeof(int);
	int k;
	cin>>k;

	if(k>len||k<=0)
		return;

	int *b=new int[k];
	for(int i=0;i<k;i++)
	{
		b[i]=data[i];
	}
	BuildMax(b,k);
	for(int i=k;i<len;i++)
	{
		if(data[i]>b[0])
			continue;
		else
		{
			b[0]=data[i];
			AdjustDown(b,0,k);
		}
	}

	for(int i=0;i<k;i++)
		cout<<b[i]<<" ";

	delete []b;
}


版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

堆处理海量数据----求前k个最小的数--时间复杂度(n * log k)

通过阅读July的书籍,发现里面求前k个最小数有很多方法。但在面对处理海量数据处理的时候,不能 把全部数据都放在电脑内存中。这时用堆来处理,并把数据放在外存中,通过读取文件的方式来读取。感觉该方法十分...

求数组中最小的k个数以及海量数据最大堆、multiset解决方案

【题目】 输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。 【方案一】 主要有两种方案。第一是利用我们熟知的...

从海量数据中找出最小的k个数

从大量(海量)数据中查找最小的k(k一般比较小)个数,这是笔试中常考的题目。  如果是从少量数据中查找最小的k个数据,并且允许修改允许修改原始数据,侧利用Partition()函数,在O(N)的时间复...

二.用最小堆方法找出海量数据中最小的k个数

思路:用数组b模拟海量数据的数组,数组a存放最小的k个数,首先将数组b的前k个数赋值给a,对a建最大堆,则此时a[0]存放a的最大元素,然后遍历b中k 以后的数据和a[0]比较,如果比a[0]小,则...

堆排序 海量数据求前N大的值

最(大)小堆的性质: (1)是一颗完全二叉树,遵循完全二叉树的所有性质。 (2)父节点的键值(大于)小于等于子节点的键值    堆的存储 一般都用数组来表示堆,i结点的父结点下标就为(i ...

海量数据取中位数,比较简单耗时的是用堆排序

海量数据取中位数 分类: 算法2012-05-11 20:35 68人阅读 评论(0) 收藏 举报 转自:http://hi.baidu.com/mxp446533129/bl...

利用MapReduce解决在海量数据中求Top K个数

利用MapReduce求海量数据中最大的K个数   package jtlyuan.csdn; import java.io.IOException; import org.apache.ha...
  • jtlyuan
  • jtlyuan
  • 2012年05月12日 19:59
  • 9745

数据结构学习笔记5-寻找最小的k个数(选择排序和堆排序)

本文摘自《寻找最小的k个数》题目描述输入n个整数,输出其中最小的k个。

求最小的K个数 O(N) 一种实现-基于堆排序

题目要求:给出一组数(有n个),求出前k个最小的数:形式化描述如下:给出一组数:c1,c2,...,Cn的无序排列A,设c1算法思想:用给定排列的前k个数建最大堆,对于后面的n-k个数,逐个进行判断,...
  • jim_wei
  • jim_wei
  • 2011年04月19日 16:44
  • 1217

海量数据最小k个数

从大量(海量)数据中查找最小的k(k一般比较小)个数,这是笔试中常考的题目。 如果是从少量数据中查找最小的k个数据,并且允许修改允许修改原始数据,侧利用Partition()函数,在O(N)的时间复...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:用堆排序的思想求最小的k个数,处理海量数据
举报原因:
原因补充:

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