强大的随机算法-简洁的O(n)时间复杂度解决查找第k大数问题优化算法

之前用了个分治法用O(n)时间复杂度简洁查找diK大数的问题。可以参考下面博客:

http://blog.csdn.net/kenden23/article/details/14645619

但是由于过于复杂,估计很多人都不想使用。

下面我用随机法来解决这个问题吧,据复杂的数学分析随机法的时间是少于4n的,而分治法反而是4n,所以其实随机法更加优化了,而且更加重要的是更加简单了。

我刚看到这个算法也是震惊了,只有分治法的不到三分之二的长度。细读一下你会发现真的是很好很强大!

下面看完整程序是如何的:

原创出处:靖空间http://blog.csdn.net/kenden23/article/details/14646479

#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)了,非常好。

运行结果:

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值