关于时间复杂度的一些个人理解

什么是时间复杂度?

时间复杂度从名字上来说就是时间的复杂程度,实际上也就是一个算法中每条语句的理论上的执行时间总和。对于不同的程序它们的时间复杂度就会不同,时间复杂度用O表示。

时间复杂度重要吗?为什么重要?

对于一个算法而言,去评论它的好坏,不只是这个算法能不能解决问题,还有是不是有效率,而这里的效率有很大一部分是由这个时间复杂度决定的。对于计算机而言,复杂的算法会占用很多计算机资源,那么一个大的程序,如果每个算法都不够好,计算机在运算时就会出现卡住,我们所使用的程序的流畅性就破坏,那么这个程序就不会被接受。

如果你参加过一些算法竞赛,完成题目的条件不只是能够解答出问题,在判题系统中还有一个 Time limit exceeded程序超时。如果出现这种情况,你的程序不能过。

综上,时间复杂度对于一个算法,一个程序来说是至关重要的。

如何计算时间复杂度?

那么如何计算时间复杂度呢?这里需要提到一个名词时间频度:(一个算法中,语句执行的次数,被称为时间频度)用T(n)表示。

时间复杂度的定义计算

下面给出时间复杂度定义的计算方法:存在某个辅助函数f(n),当n->∞时,T(n)/f(n)的极限值为不等于零的常数,则称f(n)是T(n)的同数量级函数,记做T(n)=O(f(n)),则称O(f(n))为算法的渐进时间复杂度,简称时间复杂度。

简单的来说,时间复杂度就是取T(n)中的最高阶。例如:T(n)=n^4 + 100*n +50,那么O(n)=n^4。

计算需要注意的地方:

  • 关注循环次数最多的一段代码
  • 加法法则:总复杂度等于量级最大的那段代码的复杂度
  • 乘法法则:嵌套代码的复杂度等于嵌套内外代码复杂度的乘积

示例

对于时间复杂度,有很多种类,我主要讲一下O(1),O(n),O(n^2),O(log n)这四种。

O(1)常数

	int a;
	cin>>a;
	cout<<a+1<<endl;

这就是一个简单是输入输出,T(n)=3,那么时间复杂度就是:O(1);

O(n) 线性

	int n;
	cin>>n;
	for(int i=0;i<n;i++){
		cout<<i*2<<endl;
	}

对于这个段代码,我们可以看到这里有两个循环,因为这个程序只有一个循环,所以T(n)=3+3*n,那么时间复杂度就是O(n)。

O(n^2)平方

	int m,n,sum1=0,sum2=0;
	cin>>m>>n;
	for(int i=0;i<m;i++){
		sum1+=i;
		for(int j=0;j<n;j++){
			sum2+=j;
		}
	}

对于这段代码,可以知道sum1的频度是n,sum2的频度是n^2, 总频度是T(n)=2+4n+3n2。所以时间复杂度为O(n2)。

O(logn)对数

	int i = 1;
	cin>>i;
	while(i<=n){
    i*=2
	}

这里可以理解为,2T(n)=n,那么T(n)=logn,所以时间复杂度为O(logn),如果把i=2改为i*=5那么时间复杂度为O(log5 n)。

结语

对于一个程序猿,时间复杂度是个非常重要的东西,我们从初学时就应该能够掌握它。

最后呢,有什么不足的地方,请大家多多指教。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值