堆的简单应用
来源:互联网 发布:现货数据行情分析系统 编辑:程序博客网 时间:2024/05/18 03:14
一、大数据的处理
给出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;}
测试结果
为了便于调试,我用的测试栗子比较简单,大家可以尝试一下更一般的栗子哦~
二.堆排序
思路:利用堆,建一个最大堆,每次选出最大的数据与数组末尾的数据进行交换,然后再进行一次向下
调整变成最大堆,始终保持最上面的为当前最大的数据,假设数组由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;}
测试结果:
以上便是堆的两种简单应用啦,不足之处还请大家指出哦~
0 0
- 堆的简单应用
- 堆的一些简单应用
- LinStack.h (栈堆的链式表示及简单应用)
- 堆的应用
- 【算法】堆的应用
- 堆的应用
- 【poj3253】堆的应用
- 【数据结构】堆的应用
- 堆的应用:Sequence
- 堆的应用
- 堆的应用
- 堆串的应用
- 堆的应用
- 堆的应用
- 堆的应用
- 堆的应用
- POJ2442_Sequence_堆的应用
- 堆的应用
- Linux Terminal 缩短命令行提示符
- c++数据结构之广义表
- 简单堆的创建和操作
- linux入门(一)
- Thread的两种实现方法
- 堆的简单应用
- linux入门(二):find指令的用法
- msp430f5310定时器的认识
- 一步一步理解GB、GBDT、xgboost
- 机器学习中的维数灾难
- 大话设计模式-第04章 考研求职两不误-开放封闭原则
- Hibernate对与Oracle中Clob类型的使用
- 归并排序
- 为什么需要JS里常需要做两次encodeURI(url)