堆的简单应用

原创 2016年05月31日 09:08:01

一、大数据的处理

给出N个数据,要求找到并输出这N个数里面最大的K个数

思路:利用堆,先建一个开辟一个大小为K的数组,从N个数据里拿出K个数据放到堆里面,然后再通过向

下调整法把堆调整为最小堆,此时数组的第一个元素就是堆里面最小的元素,然后在剩下的N-K个


数据中依次和堆里面最小的数据进行比较,若比第一个元素大,则交换两个的值,每交换一次就向下调

整一次,保证在最上面的是最小元素,这样一直到所有数据比较完毕,此时堆里面存储的k个数据就是最

大的k个数据。


下面是实现代码

#include<iostream>
#include<algorithm>


using namespace std;
//1.在N个数据当中找出最大的K个数

const int N = 10000;
const int K = 100;

void AdjustDown1(int a[], int size, int parent)  //建一个小堆
{
	int child = parent * 2 + 1;

	while (child < K)
	{
		if ((child + 1 < K) && (a[child + 1] < a[child]))
		{
			child++;
		}

		if (a[child] < a[parent])
		{
			swap(a[child], a[parent]);
			parent = child;
			child = parent * 2 + 1;
		}
		else
		{
			break;
		}
	}



}


void GetTopK(int a[],int TopK[])
{
	assert(K < N);
	int i = 0;
	int j = 0;
	int m = 0;
	int n = 0;

	for (i = 0; i < K; i++)
	{
		TopK[i] = a[i];     //取出a中的前k个数字放到topk[]里面
	}

	//建堆

	for (j = (K - 2) / 2; j >0; --j)
	{
		AdjustDown1(TopK,K,j);
	}

	for (int m = 0; m < N; ++m)
	{
		if (a[m]>TopK[0])
		{
			TopK[0] = a[m];
			AdjustDown1(TopK, K, 0);
		}
	}


	for (int n = 0; n < K; ++n)  //一次输出K个最大数
	{
		cout << TopK[n] << " ";
	}
	cout << endl;
}

测试代码

#include"BIgData.h"



void TestTopK()
{
	int a[N];
	int TopK[K];

	for (int i = 0; i < N; ++i)
	{
		a[i] = i;
	}

	GetTopK(a, TopK);


}
int main()
{
	TestTopK();
	system("pause");
	return 0;
}

测试结果

wKioL1c1OjPxzfEQAAAlIXQHLTo680.png

为了便于调试,我用的测试栗子比较简单,大家可以尝试一下更一般的栗子哦~

二.堆排序

思路:利用堆,建一个最大堆,每次选出最大的数据与数组末尾的数据进行交换,然后再进行一次向下

调整变成最大堆,始终保持最上面的为当前最大的数据,假设数组由n个数据,则下次就让第一个数据与

数组的第n-1个数据作比较,因为第n个数据已经是最大的了,每交换一次要调整一次,这样当比较到第

一个数据时这个堆就是一个有序的了。

实现代码如下:

//2.堆排序:建大堆,每次找到最大的数据交换到数组末尾,将剩下的数据AdjustDown,再进行交换
void AdjustDown2(int a[],int size,size_t parent)
{
	int child = parent * 2 + 1;

	while (child<size)
	{
		if ((child + 1 < size)&&a[child] < a[child + 1])
		{
			++child;
		}

		if (a[child] > a[parent])   
		{
			swap(a[child], a[parent]);
			parent = child;
			child = parent * 2 + 1;
		}
		else
		{
			break;
		}
	}
}

void Heap_Sort(int a[], size_t n)
{
	for (int i = (n - 2) / 2; i >= 0; i--)  //注意边界条件
	{
		AdjustDown2(a, n, i);
	}

	for (int i = 0; i < n; ++i)
	{
		swap(a[0], a[n - 1-i]);

		AdjustDown2(a, n - 1 - i, 0);
	}

	for (int i = 0; i < n; ++i)
	{
		cout << a[i] << " ";
	}
	cout << endl;

}


测试代码:

void TestHeap_Sort()
{
	int a[] = { 10, 12, 9, 15, 13, 17, 16, 18, 20,14 };
	Heap_Sort(a, 10);
}


int main()
{
	TestHeap_Sort();
	system("pause");
	return 0;
}


测试结果:

wKioL1c1POfgzvCsAAAIDBLIr0E804.png


以上便是堆的两种简单应用啦,不足之处还请大家指出哦~








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

数据结构::堆及堆的应用~

【堆】: 1.概念:   堆是一种特殊的树形结构,堆的把每一个节点都有一个值,我们通常所说的堆这种数据结构,指的就是二叉堆。     其实它可以被看做一个完全二叉树。   它的每个节点的子树又可以被...
  • lalu58
  • lalu58
  • 2016年12月31日 13:47
  • 806

(二叉)堆的几个应用

转载地址:http://www.cnblogs.com/chihits/archive/2011/05/02/1987637.html 1. 用作Priority Queue,这个很经典...
  • wainixy
  • wainixy
  • 2014年03月10日 19:26
  • 532

[大、小根堆应用总结一]堆排序的应用场景

前言 在整理算法题的时候发现,大根堆(小根堆)这种数据结构在各类算法中应用比较广泛,典型的堆排序,以及利用大小根堆这种数据结构来找出一个解决问题的算法最优解。因此,我打算单独将关于堆的应用独立总结...
  • shakespeare001
  • shakespeare001
  • 2016年05月10日 09:53
  • 5068

关于堆和栈的那些事

编程语言书籍中经常解释值类型被创建在栈上,引用类型被创建在堆上,但是并没有本质上解释这堆和栈是什么。我仅有高级语言编程经验,没有看过对此更清晰的解释。我的意思是我理解什么是栈,但是它们到底是什么,在哪...
  • yingfengzhaozhan
  • yingfengzhaozhan
  • 2016年02月28日 14:06
  • 586

linux面试之-谈谈你理解的堆和栈

问题描述   编程语言书籍中经常解释值类型被创建在栈上,引用类型被创建在堆上,但是并没有本质上解释这堆和栈是什么。我仅有高级语言编程经验,没有看过对此更清晰的解释。我的意思是我理解什么是栈,但是...
  • q454684431
  • q454684431
  • 2016年03月03日 12:06
  • 706

堆这种数据结构 Java实现

关于我所遇见的各种堆的含义,可以在下面这两篇博文中看到: Java虚拟机 堆和栈 深入理解计算机系统 1.7 操作系统管理硬件 本文讲的是堆数据结构的实现,并给出Java代码。 堆是一颗完...
  • l294265421
  • l294265421
  • 2016年03月18日 23:40
  • 3959

合并果子----(堆的应用)

合并果子人人皆知,然而这并不是DP,是可以每次选最小的就可以对, but我直接暴力,神奇的TLE了! 于是乎,我用了堆 #include #include #include using name...
  • Free__Life
  • Free__Life
  • 2016年08月29日 21:53
  • 195

关于 JVM 简单理解

JVM 笔记最近在看《深入理解java虚拟机》 jvm高级特性与最佳实践,下面是一些简单的个人笔记和理解,如果有错欢迎指出。1.java运行时数据区域:没错,图片是从网上找的。 其中:方法区和堆是所...
  • zyp_yun
  • zyp_yun
  • 2017年02月10日 14:19
  • 303

堆(数据结构)及堆排序

1堆 这里的堆是指一种数据结构(或数据结构属性),非指堆内存。堆属性用二叉树来体现,具堆属性的数据结构才可被叫做为堆。具堆属性的数据结构满足以下笔记的“顺序”和“形状”两个条件。 (1)顺序 ...
  • misskissC
  • misskissC
  • 2013年12月21日 02:08
  • 5487

堆和栈的概念和区别

在说堆和栈之前,我们先说一下JVM(虚拟机)内存的划分:       Java程序在运行时都要开辟空间,任何软件在运行时都要在内存中开辟空间,Java虚拟机运行时也是要开辟空间的。JVM运行时在内存...
  • pt666
  • pt666
  • 2017年04月27日 19:06
  • 1241
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:堆的简单应用
举报原因:
原因补充:

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