时间复杂度的小结

tech2023-06-04  109

1、什么是时间复杂度?

一般情况下,算法中基本操作重复执行的次数是问题规模n的某个函数f(n),算法的时间量度记作T(n)=O(f(n))。

它随问题规模n的增大,算法时间的增长率不超过f(n)的增长率,称作算法的渐进时间复杂度,简称时间复杂度。


2、时间复杂度的几条计算规则。

一般情况下,通过找出执行次数最多的代码段,把它们的运行语句的总次数表示为n的函数。

1、大部分情况下,单个表达式和语句的运行时间是常数,记为 O(1)( 即 O(n^0) )。

2、对于并列循环语句,取各循环结构计算时间的最大值。

3、对于嵌套循环结构,取最内层循环体中语句执行次数。

4、如果各层循环的次数是相互无关的,可简单采用乘法法则:各层循环的次数相乘。

5、递归算法的运行时间可分为以下两部分

(1)执行目前层次的递归分解运算所需时间。 (2)执行递归调用所需时间。


3、常见的复杂度

下面将算法中常见的f(n)值根据几种典型的数量级来列成一张表,根据这种表,我们来看看各种算法复杂度的差异

类符号举例常数O(1)返回数组的第一个元素对数O(logn)对有序数组进行折半查找线性O(n)对数组进行顺序查找nlognO(nlogn)归并排序平方O(n^2)选择排序立方O(n^3)传统的矩阵相乘指数O(2n)汉诺塔

4、常见函数的增长率


其中x轴代表n值,y轴代表T(n)值(时间复杂度)。T(n)值随着n的值的变化而变化,其中可以看出O(n!)和O(2ⁿ)随着n值的增大,它们的T(n)值上升幅度非常大,而O(logn)、O(n)、O(nlogn)随着n值的增大,T(n)值上升幅度则很小。

常用的时间复杂度按照耗费的时间从小到大依次是: O(1)<O(logn)<O(n)<O(nlogn)<O(n²)<O(n³)<O(2ⁿ)<O(n!)


5、计算时间复杂度例子

1、常数阶

int sum = 0,n = 100; //执行一次

时间复杂度为O(1)

2、线性阶

int sum = 0; for(int i = 0; i<=n; ++i) { sum += i; }

每次循环执行一次,循环n次,频度为n,时间复杂度为O(n)。

3、对数阶

int i=0; for(;i<n;i*2) { ... }

从上面的代码中,i每次乘以2后,都会越来越逼近n,当i不小于n时就会退出循环。假设循环的次数为X,则由2^x=n得出x=log₂n,因此得出这个算法的时间复杂度为O(logn)。

4、平方阶

int sum=0 forint i=0;i<n;i++){ for(int j=0;j<n;i++){ sum++; } }

从上面代码可看出,内层与外层均循环了n次,所以该算法时间复杂度为O(n^2)。

5、立方阶

for(i=1;i<=n;i++) for(j=1;j<=n;j++) for(k=1;k<=n;k++) s++;

从上面代码可以看出,执行次数是n*n *n次,时间复杂度为O(n^3)。 除了上述例子外,还有nlogn阶和指数阶。

参考资料: 《数据结构》

最新回复(0)