时空复杂度的个人理解以及课后作业理解

  忙了几天,终于是有时间来写关于第一节课的博客,这也是个人第一次自己写博客。

  在这节课里面我们首先了解了时间复杂度的概念,在线编译器1s的计算大概是10^9,我们在写算法题目需要考虑题目的时间限制与空间限制(不过一般情况下,运算空间都是充足的,在此不做分析),同时对自己的算法进行优化,能够在限制中完成题目的要求。

时间复杂度

   一个算法所需的运算时间通常与所解决问题的规模大小有关。一个算法所需的执行时间就是该算法中所有语句执行次数之和,我们把算法运行所需的时间T表示为n的函数记为T(n)的话,当n逐渐增大时T(n)的极限情况,我们就简称为时间复杂度,我们一般用O(n)那表示数量级的概念,其中的n的取值我们一般有以下要求:

  1. 忽略常数项
  2. 忽略其系数
  3. 取最高次幂项

  我们一般对于足够大的n,有常用的时间复杂度次序如下:

O(1)<O(log₂ⁿ)<O(n)<O(nlog₂ⁿ)<O(n²)<O(n³)<O(2ⁿ)

  算法时间复杂度的数量级越大,表示该算法的效率越低,反之越高。 

 例题

例题1

题目来源:P8780 [蓝桥杯 2022 省 B] 刷题统计

  这个题目我们的时间限制在1s内,所以时间复杂度必须小于等于10^9,同时根据数据范围,我们需要开long long。

  我对于这个题目有两种解决方法,第一种是暴力,我们使用if-else语句进行周末的特判,使用while语句来遍历循环,定义一个数来保存天数,最后输出就可以。看起来可以完美解决这个问题,但是我们考虑a,b都是1且n为10^18的时候,时间复杂度达到了O(10^18),就超过了题目的要求范围,所以这个算法在这道题是不能做到AC的,不过因为这道题的测试点意外的可以运行成功,成功AC,不过这只是特殊情况。

  第二种我们可以先计算出每周需要做的题目数,做到目标题目数需要的周数,我们使用题目数%(%意为取余)每个周要做的题目数可以得到剩下的题目数,剩下的题目数量是肯定小于一个周的数量,我们特判周末,然后减少对应的题目数,每次天数+1,当保存剩下题目数的数小于等于0结循环,输出的天数就是结果。

AC代码如下

#include<iostream>
using namespace std;
int main()
{
	long long a,b,n;
	cin>>a>>b>>n;
	long long sum=5*a+2*b;
	long long ans=n/sum*7;
	long long der=n%sum;
	while(der>0)
	{
		ans++;
		if(ans%7==6||ans%7==0)
		{
			der-=b;
		}
		else
		der-=a; 
	}
	cout<<ans;
	return 0;
 } 

例题2

题目来源:P2249 【深基13.例1】查找

这个题目先上代码

AC代码如下

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

同样的这个题目我们需要计算时间复杂度,这个题目我用的是二分算法,因为如果使用遍历的方法,我们的时间复杂度会为O(nm)超过了题目的要求,最后会出现TLE的结果,使用二分算法的话,我们的时间复杂度为O(n*log₂ⁿ),在题目要求的范围内。

总结

  以上题目我们也可以知道时间复杂度的重要性,也希望我们在做题目的时候可以掌握时间复杂度的计算,我们掌握熟练的话,是可以通过题目的范围来推使用的算法,还有这次计算有总结了一些问题,在这里分享一下,如果程序超过时间算出来答案我们得到的TLE,如果超时并且没有计算出来答案我们就会得到WA的结果,同时,使用devcpp软件时,我们需要注意它会有一些代码错误也可以运行的情况,例如我这次的“cout<<-1<" "”在软件可以正常运行,但是洛谷里面出问题,我们在写代码时也要更加细心,希望个人的理解可以帮助到你。

作者:贵州民族大学 卢凯

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值