算法的时间复杂度

前言:讲到算法的时间复杂度,也应该说说空间复杂度,由于篇幅过长,我将两个知识点分成了两篇文章细讲,仔细看完这篇文章并且加以练习,你一定能自己算出准确的时间复杂度,时间复杂度对于我们面试的算法题以及考研都非常的重要!!!

博主现在在备战考研,因为之前自己这方面不会,感觉学不懂,现在学懂了希望能够帮助到各位,由于是抽出时间给大家出了这么一篇文章,希望帮助到你的话转发给更多人,点个赞什么的,谢谢啦!

一:初见时间复杂度

首先我们先来看一段代码(c语言)

这里我们假如一行语句执行需要花费1s,当我们调用loveYou函数并且传入参数3000的时候

这个时候先不看while里面的语句,外面的语句将花费2s,while执行一次将花费3s(while判断算1s),当时我们n是3000,所以会执行3000*3,但是最后我们还会执行一步判断while语句不成立的情况,还有1s,总的写起来就是(1+1+3000*3+1)s,当我们将3000换成n,简写出来就是3n+3

时间复杂度是时间和问题规模n的关系,上面时间复杂度可以写成T(n)=3n+3

这一步很重要:我们只考虑阶数高的部分,就是说当我们n为3000时,T(n)=3*3000+3,这里假如T(n)=3n的话,代入3000,和前面的差距很小,T(n)=n的话,差距也只有6000,这种也算差距效地,差距大的是那些几百万数字的差距,所以我们可以简写成T(n)=n,下面我给出几个省略的例子,大家就懂了

上面的例子可以写成T(n)=n^2,因为我们只考虑阶数高的部分,这里阶数高的就是n^2,再举一个例子

 上面可以写成T(n)=n^3,这下大家可以理解了把,看到这里,其实还有一种可能性,不知道大家猜到了没有,就是T(n)=1或者T(n)=100这种情况呢,我们后面会给大家介绍到,后面用的就是另外一种方法了,这个只是带大家进入这个世界,不会觉得很突然

二:大O记法

我们来介绍一下大O写法

上面T(n)=3n+3简写的T(n)=n,我们用大O写法可以写成:T(n)=O(n),其他的类似这种写法,最后一种情况就是T(n)=100,写成T(n)=O(1)

说到大O写法,我们就可以说到加法规则,我们就可以高效率算出时间复杂度

举个例子,T(n)=n^2+n+100,这里多项相加,保留最高阶的项,就是n^2,T(n)=O(n^2)

系数变成1,就是100变成1,如果这个例子只有100的话,那我们就写成T(n)=O(1),也就是上面的最后一种情况啦!

 还有一种乘法规则

 看上面的例子,我们可以拆成T(n)=O(n^2*n)+O(n^2*log2n)

这样我们只用对比n和log2n就行了,我这里给出一张图,大家记得背熟了,有了这张图,就知道大小对比了

到这里,我们就学完了基本的了,我们从最开始的T(n)=3n+3,简写成了T(n)=n,再用大O记法、加法规则写成了T(n)=O(n),大家要记住时间复杂度是时间与问题规模n的关系。

三、例题训练

前言:大家在看题目的时候先自己做一做,再来对比讲义和答案,这样学习效率是最好的

(1)

 讲义:while循环外面都是可以直接算出来的,就是2s,我们就不用管了,因为系数最终也是换成1,我们主要看的是循环语句,因为这是出现高阶层的地方

由于while里面,不算for循环,大致是循环了n遍,里面for语句循环了n*n,n*n也就是n^2是高阶层

答案:T(n)=O(n^2)

(2)

讲义:直接看while循环,这次由于i = i * 2,这次就不是循环n次了,要注意,假设while循环了x次,那我们最终i的值就是2^x,什么时候会结束呢,只有2^x>n的时候,我们才会结束,现在算出x的值,就是log2n+1,这也是我们循环的次数,一次就是1s,1不要写进去,因为保留最高阶

答案:T(n)=O(log2n)

(3)

讲义:老套路,看循环语句,这里由于是找元素n,有可能第一次就找到,有可能在数组中间找到,有可能在最后找到,所以可能性是(1+2+3+...+n-1+n)*1/n,这前面不是等差数列嘛,直接上求和公式,就可以化成n(1+n)/2*1/n,再变成1+n/2,再变成1/2+n/2,最后根据我们的大O记法和加法规则就可以算出来啦

答案:T(n)=O(n)

这道题勾出了另外一个知识点,就是最好情况,最坏情况,平均情况,感兴趣可以自己研究一下,对于考研的学生,主要关注最坏情况和平均情况就行

四:总结

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值