算法时间复杂度定义
列举常见的时间复杂度以及如何计算:
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 就会离 n的值更近,那么当有x个2相乘后大于n,就会退出循环。那么 由 ,得到 ,那么这个代码的时间复杂度为O()。
同理,可以得到 ,所以 ,即这个代码的时间复杂度O()。
4.平方阶:
为了引入平方阶,我们要利用到线性阶来帮助理解:
上面的例子是循环嵌套,我们已经知道内部循环执行一次是O(n),那么外层需要执行n次,很容易得出这段代码的时间复杂度为O(n*n) 即为O().。
同样的道理,外层循环执行m次,内层循环为O(n),那么时间复杂度就为O(m*n)。
可以发现,循环的时间复杂度为:循环体的复杂度乘以该循环运行的次数。
那么加大难度,来看下面这个代码,它的时间复杂度是多少呢?
通过分析,当 i = 0 时,内层循环执行了 n 次,当 i = 1 使,执行了 n - 1次,...... 当 i = n-1 时,内层循环执行了 1 次,所以总共执行次数为:
n + (n - 1) + (n - 2) +......+ 1 = = 文章来源:https://www.toymoban.com/news/detail-792744.html
根据推导大 O 阶的方法,第一步:将常数项改为 1 ,没常数项则不考虑。第二步:只保留最高项,即保留 ,第三步:将最高项的系数改为 1 。 那么时间复杂度即为 O()。文章来源地址https://www.toymoban.com/news/detail-792744.html
到了这里,关于如何分析算法的时间复杂度!的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!