如何分析算法的时间复杂度!

算法时间复杂度定义

列举常见的时间复杂度以及如何计算:                          

1.常数阶:

2.线性阶:

3.对数阶:

4.平方阶:


        我们知道,学习数据结构和算法就是为了解决程序的“快”和“省”的问题,那么如何让代码运行得更快,让代码更省存储空间。则就要用到时间复杂度分析,复杂度分析是整个算法学习的精髓,只要掌握了它,数据结构和算法的内容基本上就掌握了一半。

算法时间复杂度定义

        在进行算法分析时,语句总的执行次数T (n)是关于问题规模n的函数,进而分析T(n)随n的变化情况并确定T(n)的数量级。算法的时间复杂度,也就是算法的时间量度,记作: T (n)= O(f(n))。它表示随问题规模n的增大,算法执行时间的增长率和f(n)的增长率相同,称作算法的渐近时间复杂度,简称为时间复杂度。其中f(n)是问题规模n的某个函数

        这样用大写 O( )来体现算法时间复杂度的记法,我们称之为大O记法。一般情况下, 随着n的增大,T(n)增长最慢的算法为最优算法。

 推导大O阶:
        1.用常数1取代运行时间中的所有加法常数。
        2.在修改后的运行次数函数中,只保留最高阶项。
        3.如果最高阶项存在且不是1,则去除与这个项相乘的常数(即使此常数变为1)。得到的结果就是大O阶

列举常见的时间复杂度以及如何计算:                          

1.常数阶:

         

         我们可知以上代码算法的运行次数函数是f (n) =3。 根据我们推导大O阶的方法,第一步就是把常数项3改为1。第二步,观察到没有最高阶项,所以此算法的时间复杂为O(1);

        

以上代码同理可得,此代码执行了10次。运行次数函数是f (n) =10保留最高阶项时发现,它根本没有最高阶项,只需用常数1即可,所以此算法的时间复杂为O(1)。对于此类O(1)的时间复杂度,又称常数阶。

         注意:无论这个常数是多少,我们都记作O(1),而不能是O(3)、O(12)等其他任何数字,这是初学者常常犯的错误。

        对于分支结构而言,无论是真,还是假,执行的次数都是恒定的,不会随着n的变大而发生变化,所以单纯的分支结构(不包含在循环结构中),其时间复杂度也是O(1)。

2.线性阶:

        线性阶相对于常数阶是比较复杂的,要确定此阶数,我们则需要确定某个特定语句或者某个特定语句集运行的次数。关键就要分析循环结构的运行情况。

可以看出以上代码共执行了 3n+3 次,它的运行次数函数是f (n) =3+3n,我们只保留最高阶项,并且除与这个项相乘的常数(即将 3n 的 3 改为 1),则时间复杂度为 O(n)。

3.对数阶:

        关于对数阶我们可以通过如下代码来进行理解:

        

        由于每执行一次 i *= 2,i 就会离 n的值更近,那么当有x个2相乘后大于n,就会退出循环。那么 由^{^{_{_{_{}}}}} 2^{x} =n,得到 x = \log_{2}n,那么这个代码的时间复杂度为O(\log n)。

          

 同理,可以得到 3^{x} = n,所以 x = \log_{3}n,即这个代码的时间复杂度O(\log n)。

4.平方阶:

        为了引入平方阶,我们要利用到线性阶来帮助理解:

上面的例子是循环嵌套,我们已经知道内部循环执行一次是O(n),那么外层需要执行n次,很容易得出这段代码的时间复杂度为O(n*n)  即为O(n^{2}).。

 

同样的道理,外层循环执行m次,内层循环为O(n),那么时间复杂度就为O(m*n)。

可以发现,循环的时间复杂度为:循环体的复杂度乘以该循环运行的次数。

        那么加大难度,来看下面这个代码,它的时间复杂度是多少呢?

 通过分析,当 i = 0 时,内层循环执行了 n 次,当 i = 1 使,执行了 n - 1次,...... 当 i = n-1 时,内层循环执行了 1 次,所以总共执行次数为:

        n + (n - 1) + (n - 2) +......+ 1 =  \frac{(1+n)*n}{2} = \frac{n^{2}}{2} + \frac{n}{2} 

根据推导大 O 阶的方法,第一步:将常数项改为 1 ,没常数项则不考虑。第二步:只保留最高项,即保留  \frac{n^{2}}{2} ,第三步:将最高项的系数改为 1 。 那么时间复杂度即为 O(n^{2})。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

bright_汉堡包

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

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

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

打赏作者

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

抵扣说明:

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

余额充值