# 时空复杂度及其例题

时空复杂度及其例题

1.时空复杂度

时空复杂度分为时间复杂度和空间复杂度

2.时间复杂度

时间复杂度:程序运行会消耗多少时间
在此,为了方便讨论,我们假定每一个语句消耗的时间一样,视为一个时间单元
**一般情况下,我们可以通过下列方式粗略计算一个程序的时间复杂度:
1.忽略常数项
2.忽略系数
3.只保留最高项

常见的时间复杂度:
从小到大依次是:O(1)<o(logn)<O(n)< O(nlogn)< O ( n2) <O ( n3 ) <O ( 2n ) <O(n!)
应用:
1.由题目数据范围判断编写的代码是否会TLE
2.通过题目数据范围反推算法

例题P8780

最直接的想法一般是:

#include<iostream>
using namespace std;
long long a, b, n, i,ans;
int main()
{
	cin >> a >> b >> n;
	for (i = 1;; i++)
	{
		if (i % 6 == 0 || i % 7 == 0)
		{
			ans += b;
		}
		else
		{
			ans += a;
		}
		if (ans >= n)
		{
			cout << i;
			return 0;
		}
	}
		return 0;
}

但是这个只能得到一半的分,因为忽略了另外50%的测试数据1≤a,b,n≤1018
假设最坏的情况:a=b=1;m=1018时,那么大概执行了1018次运算,已经超出了测评机1s的运算次数(大概109)
所以应该优化一下算法,降低时间复杂度
下面是优化后的算法:

#include<iostream>
using namespace std;
long long a, b, n, i,ans,sum ,m;
int main()
{
	cin >> a >> b >> n;
	sum = 5 * a + 2 * b;//一周的刷题数
	if(n%sum==0)
	{
		cout << n/sum * 7;
		return 0;
	}
	else
	{
		m = n-n / sum * sum;//n/sum的意思是有几周
		for (i = 1; i <= 7; i++)
		{
			if (i>=6)
			{
				ans += b;
			}
			else
			{
				ans += a;
			}
			if (ans >= m)
			{
				cout << n / sum * 7+i;
				return 0;
			}
		}
	}
		return 0;
}

P2249

这道题如果直接查找也会超时,此时就要用二分法查找

#include<iostream>
using namespace std;
int n,m,a[10000000],x;
int main()
{
	cin >> n >>  m;
	for (int i = 0; i < n; i++)
	{
		cin >> a[i];
	}
	while (m--)
	{
		cin >> x;
		int r = 0, l = n;
		while (r < l)
		{
			int mid = (r + l) / 2;
			if (a[mid] < x)
			{
				r = mid+1;
			}
			else
			{
				l = mid;
			}
		}
		if(a[r]==x)
		{
			cout << r+1<<" ";
			continue;
		}
		else
		{
			cout << -1<<" ";
			continue;
		}
	}
		return 0;
}

3.空间复杂度

绝大多数情况下不会卡,没啥用。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值