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

本文探讨如何运用分治法和二分查找策略,将一个原本具有O(n^4)时间复杂度的问题优化,降低计算负担,提升算法效率。通过实例解析,展示了分治法在解决复杂计算问题中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#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),以此类推




}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值