强大的随机算法-简洁的O(n)时间复杂度解决查找第k大数问题优化算法
2013-11-09 18:35
369 查看
之前用了个分治法用O(n)时间复杂度简洁查找diK大数的问题。可以参考下面博客:
/article/1347606.html
但是由于过于复杂,估计很多人都不想使用。
下面我用随机法来解决这个问题吧,据复杂的数学分析随机法的时间是少于4n的,而分治法反而是4n,所以其实随机法更加优化了,而且更加重要的是更加简单了。
我刚看到这个算法也是震惊了,只有分治法的不到三分之二的长度。细读一下你会发现真的是很好很强大!
下面看完整程序是如何的:
原创出处:靖空间/article/1347605.html
这个程序的强大之处是它随机地选择分列的下标,而不用前面那种复杂的分治法。
时间复杂度最坏情况还是O(n*n),但是平均时间复杂度已经达到了O(n)了,非常好。
运行结果:
/article/1347606.html
但是由于过于复杂,估计很多人都不想使用。
下面我用随机法来解决这个问题吧,据复杂的数学分析随机法的时间是少于4n的,而分治法反而是4n,所以其实随机法更加优化了,而且更加重要的是更加简单了。
我刚看到这个算法也是震惊了,只有分治法的不到三分之二的长度。细读一下你会发现真的是很好很强大!
下面看完整程序是如何的:
原创出处:靖空间/article/1347605.html
#include<iostream> #include<vector> #include<algorithm> #include<cstdlib> #include<time.h> using namespace std; //low and up have to be according indices in C++; //k mean the kth number, according C++ stlye index is k-1 int selectKthNumRand(vector<int> &vi, int low, int up, int k) { int mIndex; //注意这里会有几率是up=0, low=0,所以要作特殊处理 if(up-low != 0) mIndex = rand()%(up-low) + low; else mIndex = 0; int mNum = vi[mIndex]; vector<int> vec1, vec2, vec3; for (int i = low; i <= up; i++) { if(vi[i] > mNum) vec3.push_back(vi[i]); if(vi[i] == mNum) vec2.push_back(vi[i]); if(vi[i] < mNum) vec1.push_back(vi[i]); } if(vec1.size()>=k) return selectKthNumRand(vec1, 0, vec1.size()-1, k); else if(vec1.size()+vec2.size()>=k) return mNum; else if(vec1.size()+vec2.size()<k) return selectKthNumRand(vec3, 0, vec3.size()-1, k-vec1.size()-vec2.size()); } int main() { int a[] = {3,5,7,9,2,12,1,0,8,14,4,6,10,11,13,5,8,12}; vector<int> va(a, a+18); int b[] = {31,25,37,49,52,63,71,20,87,95,34}; vector<int> vb(b, b+11); for(auto x: va) cout<<x<<" "; cout<<endl; srand(time(NULL)); int mid = selectKthNumRand(va, 0, va.size()-1, 10); cout<<"The Kth number is: \n"; cout<<mid<<endl; cout<<endl; system("pause"); return 0; }
这个程序的强大之处是它随机地选择分列的下标,而不用前面那种复杂的分治法。
时间复杂度最坏情况还是O(n*n),但是平均时间复杂度已经达到了O(n)了,非常好。
运行结果:
相关文章推荐
- 如何用O(n)时间复杂度查找第k大数的优化算法 C++程序
- 对经典算法百鸡百钱问题的优化解决,使其时间复杂度为n。
- C++解决最大子列和问题,算法时间复杂度优化
- 类斐波那契问题中动态规划的时间复杂度优化
- 关于SelfNumbers问题时间复杂度问题解决方案
- 2018年全国多校算法寒假训练营练习比赛(第三场)E---进击吧!阶乘(Java代码,另附Java解决大数问题的模板)
- 算法与数据结构——时间复杂度验证:最大子序列问题 Max Subsequence Sum
- 算法:C++实现O(n)复杂度内查找第K大数
- 用log(n)时间复杂度解决Fibonacci问题
- 【问题解决】删除链表结点,要求时间复杂度为O(1)
- 树链剖分的一种妙用与一类树链修改单点查询问题的时间复杂度优化——2018ACM陕西邀请赛J题
- Sat问题——穷举(这里读文件时间很浪费,最初写的,可以进行很多优化,其他优化算法目前不能发布)
- C/C++面试之算法系列--时间复杂度为o(N)查找1至N-1构成的a[N]重复元素
- [LintCode] Median(期望时间复杂度O(n)求中位数和第k大数)
- 在线性时间复杂度内求解第k小元素问题
- 轮廓问题/Outline Problem-->改进的算法及时间复杂度分析
- UOJ#9 浅谈在线仙人球嵌套动态网络路径剖分优化的分支定界贪心剪枝启发式迭代加深人工智能搜索决策算法解决问题
- 算法:动态规划之金矿问题(时间复杂度O(n*w))
- 线性时间算法解决最大间隙问题
- 算法细节系列(27):时间复杂度为何还能优化?