二.用最小堆方法找出海量数据中最小的k个数
来源:互联网 发布:网络黄金egd是传销吗 编辑:程序博客网 时间:2024/06/10 21:54
思路:用数组b模拟海量数据的数组,数组a存放最小的k个数,首先将数组b的前k个数赋值给a,对a建最大堆,则此时a[0]存放a的最大元素,然后遍历b中k
以后的数据和a[0]比较,如果比a[0]小,则赋值给a[0],并且对a进行重新的调整是a[0]仍然最大,这样知道把b遍历完为止。
调整堆用时logk,遍历b用时n,时间复杂度nlogb
#include<iostream>using namespace std;void adjustHeap(int a[],int s,int n){int temp=a[s];for(int i=2*s+1;i<=n;i=i*2+1){if((i+1)<=n&&a[i]<a[i+1])i++;if(temp>a[i])break;a[s]=a[i];s=i;}a[s]=temp;}void heap_buid(int a[],int n){for(int i=n/2-1;i>=0;i--){adjustHeap(a,i,n-1);}/*for(int i=n-1;i>=1;i--){swap(a[0],a[i]);adjustHeap(a,0,i-1);}*/}void main(){int k;int b[]={7,3,9,0,1,2,5,10,100,-1,-2};int n=sizeof(b)/sizeof(int);cout<<"b:";for(int i=0;i<n;i++){cout<<b[i]<<" ";}cout<<endl;cout<<"请输入要找出最小的多少位数"<<endl;cin>>k;int *a=(int*)malloc(sizeof(int)*k);for(int i=0;i<k;i++){a[i]=b[i];}heap_buid(a,k);cout<<"a1:";for(int i=0;i<k;i++){cout<<a[i]<<" ";}cout<<endl;for(int i=k;i<n;i++){if(a[0]>b[i]){a[0]=b[i];adjustHeap(a,0,k-1);}}cout<<"a2:";for(int i=0;i<k;i++){cout<<a[i]<<" ";}cout<<endl;system("pause");}
0 0
- 二.用最小堆方法找出海量数据中最小的k个数
- 从海量数据中找出最小的k个数
- 求数组中最小的k个数以及海量数据最大堆、multiset解决方案
- 寻找数组中最小的k个数 "最小堆方法"
- 用堆排序的思想求最小的k个数,处理海量数据
- 找出一堆数据中最小的K个数问题
- 找出一堆数据中最大或者最小的K个数
- 找出一堆数据中最小的K个数问题
- 找出一堆数据中最大或者最小的K个数
- 海量数据最小k个数
- 找出数组中最小的 K 个数
- 找出一组数中的最小k个数 适合海量数据处理的方法
- 找出最小的k个数
- 从n个数中,找出最小的k个数
- 找出n个数中最小的k个数
- 寻找最小的k个数,处理海量数据的思想
- 最小的K个数 (最小堆)
- 最小的k个数--适合处理海量数据
- NDK USB-HID 转串口通信参数设置代码
- C# 获取当前日期(转)
- Android Support 包里究竟有什么
- Java有两种线程分别是用户线程(UserThread)和守护线程(DaemonThread)
- Android程序:数据存储之SQLite的内置函数操作
- 二.用最小堆方法找出海量数据中最小的k个数
- HDU 5272 : Dylans loves numbers
- arduino rgb 3色灯
- LLVM/Clang
- Uncaught TypeError: Illegal invocation
- jquery引用的异常
- ADI实验室电路:带抗混叠滤波器的宽带接收机
- Android Service创建USB HOST通信
- HBase学习总结(1):HBase的下载与安装