用堆排序的思想求最小的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个最小数有很多方法。但在面对处理海量数据处理的时候,不能 把全部数据都放在电脑内存中。这时用堆来处理,并把数据放在外存中,通过读取文件的方式来读取。感觉该方法十分...
  • woailvmengmeng
  • woailvmengmeng
  • 2014年04月10日 20:05
  • 947

海量数据处理算法(top K问题)

举例有一个1G大小的一个文件,里面每一行是一个词,词的大小不超过16字节,内存限制大小是1M。返回频数最高的100个词。思路 首先把文件分开 针对每个文件hash遍历,统计每个词语的频率 使用堆进行遍...
  • u010321471
  • u010321471
  • 2016年09月22日 20:20
  • 2489

[剑指Offer]最小的K个数

题目描述 输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。 输入 int[] input:待搜索的数组 int ...
  • shakespeare001
  • shakespeare001
  • 2016年04月29日 14:29
  • 2715

算法题:求数组中最小的k个数

题目:输入n个整数,找出其中最小的k个数。 《剑指offer》给出了两种实现算法: 算法1:采用Partition加递归法,该算法可以说是快速排序和二分查找的有机结合。...
  • JXH_123
  • JXH_123
  • 2014年08月06日 21:15
  • 1549

算法10—海量数据处理之top k算法

第一部分:Top K 算法详解 问题描述 百度面试题:     搜索引擎会通过日志文件把用户每次检索使用的所有检索串都记录下来,每个查询串的长度为1-255字节。     假设目前有一千万个记...
  • u012129558
  • u012129558
  • 2016年06月02日 16:27
  • 888

n个数 找到最小的k个数 几种解法 和java实现

思路一:排序法,  对n个数排序,然后迭代前k个数即可,时间复杂度以 快排为准 是O(nlogn),代码略    思路二:局部替换法   假设前k个数就是整个数组中最小的,找出最大的数和k+...
  • yangchangji
  • yangchangji
  • 2017年03月03日 15:49
  • 2173

最小的k个数(Java实现)

本题为剑指offer面试题30 牛客网测试地址:https://www.nowcoder.com/questionTerminal/6a296eb82cf844ca8539b57c23e6e...
  • zjkC050818
  • zjkC050818
  • 2017年05月06日 12:12
  • 265

求无序数组之中最小的k个数

在无序数组中国找最小的k个数,一般有以下几种办法:   1.比较排序,然后找最小的k个数,时间复杂度下界为O(nlogn)   2.计数排序,时间复杂度可以做到O(n),但是要看具体的数据情况。也...
  • qq_26010491
  • qq_26010491
  • 2016年01月29日 15:56
  • 872

寻找最小的k个数,处理海量数据的思想

题目:在n个数中找出最小的k个数,例如在1,3,5,7,9,2,4,6,8,10中找出最小的4个数,那么结果就为1,2,3,4 分析:最为直接的办法就是将这n个数先进行排序,然后再取出前k个即为最...
  • qingqiulengya
  • qingqiulengya
  • 2016年07月07日 11:24
  • 281

剑指offer 面试题30:最小的K个数(topK问题) 题解

剑指offer 面试题30:最小的K个数 题目: 输入n个整数,找出其中最小的k个数。例如:例如输入4 、5 、1、6、2、7、3 、8 这8 个数字,则最小的4 个数字是1 、2、3 、4 提...
  • yanglr2010
  • yanglr2010
  • 2016年05月04日 22:57
  • 1289
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:用堆排序的思想求最小的k个数,处理海量数据
举报原因:
原因补充:

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