经典算法:超大数组,取出最大N数
来源:互联网 发布:传奇版本火灵db数据 编辑:程序博客网 时间:2024/06/03 17:59
转载于:http://blog.csdn.net/yanzi1225627/article/details/8109035
这里先讲一种类似于快速排序的方法。注意题目要求,不要求完全排序,只要求最快解决问题!这个题是我面试NI公司时,对方问我的。原话是从1亿个数据里,找出前一百个最大的。
首先看源码吧:
void findMaxN(int a[], int start, int end, int N)//从数组a里,找出前N个最大的。如果是a[100],则start = 0, end = 99.注意这个索 引问题{ int mid = (start + end)/2; int i = start, j = end;while(i<j){ while(i<j && a[i]<=a[mid]) i++; while(i<j && a[j]>=a[mid]) j--;swap(a[i], a[j]);}/*注意这个while出来之后,i一定是等于j的,且从i 到 end是较大的那一端*/if(end-i+1 == N)return;if(end - i+1 > N)findMaxN(a, i, end, N);else findMaxN(a, start, i, N - (end -i +1));}
然后类似的思路,从j那一端遍历,当右边的数据a[j ] 小于基准值a[mid],则小while循环会跳出。然后会运行swap()这个函数,将两个值进行交换 。 这样最外面的while循环出来之后,i一定是等于j的,注意这里i 和j不一定等于当前域中的mid。而且从i到end都是较大的,然后看看较大的那一端的数据有多少个,然后进行遍历。
如果已经等于要找的N个,则跳出函数。如果大于N,则要从i到end为区间内接着找;如果小于N,比如说要找前50个最大的,结果end-i+1才等于20,也就是从i到end有20个较大的数,这就需要从 start(第一次时,可以认为是0)到i 区间内再找50-20 = 30个最大的。
至于swap的函数,利用引用实现如下:
void swap(int &a, int &b)
{
int temp = a;
a = b;
b= temp;
}
最后说说,如果这个函数执行完毕了,我怎么访问找到的最大的N个数呢? 很简单,假设数组长度为n, 从a[n-1], a[n-2]。。。顺序取N个数,就是找到的最大的前N个数据了!这个算法的最大情况时间复杂度是o(n的平方),最好情况是o(n), 平坦下来也是o(n).
等我空我介绍第二种思路,上面代码是即兴写的,源码我一会上传。
http://download.csdn.net/detail/yanzi1225627/4684046
0 0
- 经典算法:超大数组,取出最大N数
- 计算N!(数组模拟超大数运算)
- [ACM_ZJUT_1382]计算N!(数组模拟超大数运算)
- 超大数阶乘算法
- 笔试面试算法经典-打印n个数组中最大的topk
- 【HDU 4217】【经典题 树状数组求前k大】 Data Structure?【n个数1-n,k次操作,每次取出第ki小的数。问所有取出数字之和。】
- 数组输出超大数阶乘
- 从数组中查找出最大最小两数的log(n)算法
- 算法设计:从一个很大很大的数组里找前N个最大数的思路之一
- 从数组中查找出最大最小两数的log(n)算法
- 经典算法学习——求数组里面第N大的数
- 笔试面试算法经典-找到数组中出现次数大于N/k的数(Java)
- 两个超大数相加算法
- 阿里巴巴面试算法题:有一个函数int getNum(),每运行一次可以从一个数组V[N]里面取出一个数,N未知,当数取完的时候,函数返回NULL。现在要求写一个函数int get(),这个函数运行一次可以从V[N]里随机取出一个数,而这个数必须是符合1/N
- JAVA算法(一) -- 经典回文数(取出任意范围的回文数)
- 算法学习---求数组中的最大数
- 数组排序算法之,组成最大数
- n个元素的数组中找出前K个最大数最有效算法O(nlg(k))
- 响铃:海外移动市场,到底是陷阱还是“馅饼”?
- Eclipse导入github上的项目出错
- Maven工程显示小红叉,项目编译打包运行都可以以
- ajax的验证提交例子
- C# 结构
- 经典算法:超大数组,取出最大N数
- Java位运算符介绍
- 空间索引
- 简单的利用scrollerview实现的图片的放大缩小,以及中心点的固定
- Linux学习笔记(十八、脚本执行方式)
- Tomcat 7 如何手工部署war包对应的Java项目
- Hadoop MapReduce Job提交后的交互日志
- 【锋利的jQuery阅读笔记】认识jQuery
- jQuery EasyUI使用教程之在数据网格中添加一个分页