- 时间复杂度
在进行算法分析时,执行算法在最坏的情况下所需要的时间称之为时间复杂度。使用Big O notation表示。
一般使用大写O()来体现算法时间复杂度的记法,我们称之为大O记法。一般情况下,随着n的增大,T(n)增长最慢的算法为最优算法。
常用的表示
O(1):Constant Complexity :Constant 常量复杂度
O(log n) :Logarithmic complexity:对数复杂度
O(n):Linear complexity:线性复杂度
O(n^2):N-Square Complexity:平方
O(n^3):N-cube complexity:立方
O(2^n):Exponential Growth:指数
O(n!):Factorial:阶乘
只看最高复杂度的运算
时间复杂度从小到大为(越小越好):
O(1)<O(logn)<O(n)<O(nlogn)<O(n2)<O(n3)<O(2n)<O(n!)<O(nn)
最坏时间复杂度是应用运行的保证,而平均时间复杂度则是最有意义的,因为它是期望的运行时间。
- 时间复杂度的计算
(1)找出算法中重复执行次数最多的语句的频度来估算算法的时间复杂度;
(2)保留算法的最高次幂,忽略所有低次幂和高次幂的系数;
(3)将算法执行次数的数量级放入大Ο记号中。
例如,下列三个简单的程序段:
在程序段(a)中,语句x=x+1不在任何一个循环体内,则它的时间频度为1,其执行时间是个常量;而(b)中,同一语句被重复执行n次,其时间频度为n;显然在(c)中,该语句的频度为n2。由此,这三个程序段的时间复杂度为O(1)、O(n)、O(n2)。分别为常量、线性阶和平方阶。
对于较为复杂的算法,可以将它们分割成容易估算的几个部分,然后利用O的求和原则得到整个算法的时间复杂度。例如,若算法的两个部分的时间复杂度分别为T1(n)=O(f(n))和T2(n)=O(g(n)),则总的时间复杂度为:
T(n)= T1(n)+ T2(n)=O(max(f(n), g(n)))
然而,很多算法的运行时间不仅依赖于问题的规模,也与处理的数据集有关。例如,有的排序算法对某些原始数据(如自小至大有序),则其时间复杂度为O(n),而对另一些数据可达O(n^2)。因此,在估算算法的时间复杂度时,均以数据集中最坏的情况来估算。
-
空间复杂度
一个程序的空间复杂度是指运行完一个程序所需内存的大小。利用程序的空间复杂度,可以对程序的运行所需要的内存多少有个预先估计。一个程序执行时除了需要存储空间和存储本身所使用的指令、常数、变量和输入数据外,还需要一些对数据进行操作的工作单元和存储一些为现实计算所需信息的辅助空间。程序执行时所需存储空间包括以下两部分。
(1)固定部分。这部分空间的大小与输入/输出的数据的个数多少、数值无关。主要包括指令空间(即代码空间)、数据空间(常量、简单变量)等所占的空间。这部分属于静态空间。
(2)可变空间,这部分空间的主要包括动态分配的空间,以及递归栈所需的空间等。这部分的空间大小与算法有关。 -
时间复杂度VS空间复杂度:
算法复杂度分为时间复杂度和空间复杂度。其作用: 时间复杂度是指执行算法所需要的计算工作量;而空间复杂度是指执行这个算法所需要的内存空间。(算法的复杂性体现在运行该算法时的计算机所需资源的多少上,计算机资源最重要的是时间和空间(即寄存器)资源,因此复杂度分为时间和空间复杂度)。
就目前来说,除了在一些特殊情况下,我们都是更加注重时间复杂度,而不是空间复杂度。注意,这里我们强调了,除了一些特殊情况外,有些特殊情况下,空间复杂度可能会更加重要。
参考:https://blog.csdn.net/qiumengchen12/article/details/45697405
https://baijiahao.baidu.com/s?id=1609024533531824968&wfr=spider&for=pc