分治法:利用二分查找优化O(n^4)指数时间复杂度问题

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

//二分查找  遵循迭代器原则,end迭代器指向最后一个元素的下一个位置,beg迭代器指向需要查找范围的第一个元素
bool myBinary_search(const vector<int>::iterator beg, const vector<int>::iterator end, const int &val)
{
     int l=0,r= end - beg;
     while(r-l>=1)
	 {
     	int i=(l+r)/2;
     	if(*(beg+i)==val) return true;
     	else if(*(beg+i)<val) l=i+1;
     	else r=i;
	 }
     return false;
}
int main()
{
	vector<int> ivec; //保存牌点
	int m;  //抽牌点数之和等于的点数
	for (int i = 0; i !=ivec.size(); ++i) {
		for (int j = 0; j !=ivec.size(); ++j) {
			for (int k = 0; i !=ivec.size(); ++i) {
				for (int l = 0; l != ivec.size(); ++l) {
					if(ivec.at(i)+ivec.at(j)+ivec.at(k)+ivec.at(l)==m)
					{
						cout<<"yes";
						return 0;
					}
				}
			}
		}
	}
	cout<<"no";
	return 0;

	//以上程序是O(n^4)指数时间复杂度,我们使用一次二分搜索让其变成   O(n^3+2logn)
	//二分搜索会产生logn,排序会产生logn的时间复杂度
	sort(ivec.begin(),ivec.end());
	for (int i = 0; i !=ivec.size(); ++i) {
		for (int j = 0; j !=ivec.size(); ++j) {
			for (int k = 0; i !=ivec.size(); ++i) {
				if(binary_search(ivec.cbegin(),ivec.cend(),m-ivec.at(i)-ivec.at(j)-ivec.at(k)))
				{
					cout<<"yes";
					return 0;
				}
			}
		}
	}
	
	//我们可以列举n*n个空间的数,使时间复杂度从O(n^3)变成O(n^2+logn+logn^2),空间复杂度为O(n^2),以此类推




}

猜你喜欢

转载自blog.csdn.net/chongzi_daima/article/details/104089421