如何计算时间复杂度?

前言

有关时间复杂度,我们需要知道:

  1. 时间复杂度不是算法的运行时间。
    时间复杂度可以说是一个模型,这个模型描述了算法的运行时间随问题规模 N 的变化情况。
    举个栗子
    某算法的时间复杂度为:T(N) = O(f(N))
    这个式子的含义存在一个点 n0 ,使得 当 N > n0,T(N) < f(N),从函数图像上表现为 T(N) 渐进 f(N)f(N) 的增长率 大于 T(N)
    时间复杂度通常使用大O表示法,就是上面那种,如果题目未指定,就是用大O表示。
    大O表示法是最坏情况的时间复杂度,除了这种情况,还有平均时间复杂度、最好时间复杂度,均摊时间复杂度。【点我了解他们的区别】
  2. 比较算法的效率可以看时间复杂的增长率。
  3. 算法的时间复杂度并能通过改进编程得以提高,关键还得优化算法。

如何计算时间复杂度

 计算最坏情况复杂度

  1. 顺序结构 :所有的语句的运行时间和。
  2. 循环结构 :循环中的语句乘于迭代次数。
  3. 嵌套的循环 :循环中的语句乘于所有循环的大小。
    举个栗子
	for(i=1;i<=n;i++)
	{
	    for(j=1;j<=i;j++)
	    {
	        x=0;
	        for(k=1;k<=n;k++)
	            x+=a*b;
	    }
	}

   解析:

	三个循环嵌套:
	单独看三个循环都执行了n次,所以 T(n) = n^3 + n^2
	故时间复杂度为 T(n) = O( n^3 )
	n^2对 n^3 来说可以忽略。
  1. 条件结构 :if语句的执行时间与else语句执行时间求和。
    举个栗子
	sum = 0;
	for( i = 1; j < n; j++ )
		for( j = 1; j < i * i; j++ )
			if( j % i == 0 )
				for( k = 0; k < j; k++ )
					sum++;

   解析:

	第一个for循环执行次数:n-1 即 n
	第二个for循环执行次数:n^2 -1 即 n^2
	if语句执行(不考虑 if 真假问题):n^3
	第三个for循环执行:n^2
	当 if 语句为真时的执行次数:1+2+······+(n-1) 即 1/2 (n-1)n 即 n^2
	故算法的时间复杂度为:n^2 * n^2 = n^4
  1. 递归算法
    递归和循环的区别,就是循环都能用递归实现,但是有的递归却不能用循环实现,递归算法总是向问题规模不断变小的方向发展。
    首先,我们看一个递归能否转换成循环
    可以转换为循环的递归,时间复杂度和递归的次数成正比。
    举个栗子
	long fac(int n)
	{
	     if (n>1)
	             return n*fac(n-1)
	             else
	                   return 1;
	}

   解析:

	我们可以发现这是一个计算n!的递归,递归了n次,所以时间复杂度为O(n)

   使用分治法主定理分析复杂度
   当问题规模成倍地减少时,我们可以使用这个公式。
   使用问题规模减小问题递归求解主定理分析复杂度

   当问题规模不是成倍地减少时,我们可以使用这个公式。
递归求解主定理
   除了套公式,我们还可以使用代入法等方法计算

	使用代入法是不断将原式带入方程,而不是代入实际数据计算。

   举个栗子

在这里插入图片描述
   【更多方法,点击这里】

解题技巧

技巧1
1. 忽略低阶和常数对时间复杂度的影响,例如:6n2+n我们经常忽略系数6和低阶项n,令其为n2
2. 如果算法中有循环结构我们通常估算最内层循环体中语句的时间复杂度

技巧2
从严蔚敏老师的数据结构中,我们可以将算法中所要研究的时间复杂度语句都当作基本操作,我们只需要找到基本操作的原操作(即算法的时间和原操作的重复执行次数成正比),再确定算法的重复执行次数,时间复杂 = 原操作 * 重复执行次数。

 均摊时间复杂度计算

   如果算法对大部分输入都能很好的处理(算法性能比较好),但是对个别输入,算法的性能比较差,我们这里就可以给使用均摊分析,来确定算法的时间复杂度。均摊结果一般都为时间复杂度低的结果。【深入了解,点我】

 特定算法的时间复杂度

   有些特定算法的时间复杂度不光能帮我们理解时间复杂度模型,还能帮助我们解题,记住一些特定的时间复杂度很有必要。如Java中的动态数组。

  1. 十大排序算法
    在这里插入图片描述
    详情查看菜鸟教程中关于十大排序算法的教程:【点我去到菜鸟教程】
  2. 其他比较常见的算法还需要我们去研究

总结

算法的时间复杂度要求我们要有一定的数学基础,不能只停留在书面知识,还需要多做练习体验时间复杂度的计算,和对时间复杂的理解。
学习数据结构书籍推荐
推荐《数据结构与算法分析Java语言描述(Mark Allen Weiss)》
当然也可以参考另一本《数据结构与算法经典问题分析》
这里我们附上Mark Allen Weiss数据结构书籍课后习题答案(英文版)的链接【点我】

  • 28
    点赞
  • 181
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

筷头哥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值