算法-十亿数字中找出最大的一万个--9-3

来源:互联网 发布:ubuntu samba服务器 编辑:程序博客网 时间:2024/06/10 02:51
十亿的数据量    4G内存空间
1.建数组  循环一万次 找出最大的一万个
  复杂度o(n*m) n为10亿  m为1万


2.借助快速排序   
复杂度o(nlogn)


3.不想放入内存 占据如此大的空间
建一个长度为1万的数组    将前1万个数字放入数组   其余数  遍历10亿 比较每一个和数组中的最小数的大小  小则不管 大则替换插入  


4.大顶堆
建一个空间为1万的堆(小顶堆) 堆顶是最小数字 每次读取一个 数字 判断堆 是否已满  。  判断数字是否大于堆顶元素  如果大于  则删除 插入新元素 。插入时会重建堆。重建复杂度为o(logn)   .性能好很多 所以现在时间复杂度为  o((n-m)*logm)  性能已经达到最优


 --找出 数组中第K大的数
时间复杂度为o(n)  空间复杂度为o(1)
//核心代码
int all=(1+100)*100/2
for(int i=0;i<array.length;i++){
all-=array[i];
}
sysout("缺失数字为"+all);


//核心代码


int i=partition(array,begin,end);
if(i+1>k){
find(array,begin,i-1,k);
}else if(i+1<k){
find(array,i+1,end,k);
}else{
sysout("找到了"+array[i]);


return;
}


//partition方法


if(begin<end){
int key=array[begin];
while(begin<end){
while(begin<end && array[end]>key){
end--;
}
if(begin<end){
array[bagin]=array[end];
begin++;
}
while(begin<end && array[end]<key){
begin++;
}
if(begin<end){
array[end]=array[begin];
end--;
}
}
array[begin]=key;
}
return begin;
0 0
原创粉丝点击