时间复杂度(time complexity)又称时间复杂性或计算复杂度,它是算法有效性的度量之一。
时间复杂度是一个算法运行时间的相对量度,因为执行简单操作所需要的时间因机器的软硬件环境不同而不一样,所以只讨论影响运行时间的另一个因素——算法中进行简单操作次数的多少,所以通常把算法中包含简单操作次数的多少叫做该算法的时间复杂度。
若解决一个问题的规模为n,即所处理的数据中包含n个元素,则算法的时间复杂度通常是n的一个函数f(n)。
一般只要大致计算出相应的数量级(Order)即可,所以采用大O表示,比如当f(n)为n的多项式时,取最高次幂即可。
比如内层循环的执行次数为 f(n)=2n2+3n,则时间复杂度为O(n2).
算法的时间复杂度通常有 O(1)(常量阶)、O(n½) 、 O(n)(线性阶)、 O(logn)(对数阶)、 O(nlogn)、 O(n2)(平方阶)、 O(n3)、 O(2n)(指数阶)、O(n!)等形式。
当n大于一定的值后,各种不同的数量级对应的值存在着如下关系:
O(logn)<O(n½)<O(n)< O(nlogn)< O(n2)<O(n3) <O(2n)<O(n!)
一个算法的时间复杂度还可以具体分为最好、最坏和平均三种情况,对于多数算法,平均和最差两种情况下的时间复杂度相应的数量级往往相同,也有一些算法,其最好、最坏、平均三种情况下的时间复杂度或相应数量级都相同。
空间复杂度(space complexity)或称空间复杂性是对一个算法在运行过程中临时占用存储空间大小的量度,包括存储算法本身所占用的存储空间、算法的输入/输出数据所占用的存储空间和算法在运行过程中临时占用的存储空间等方面。
一个算法的空间复杂度通常只考虑在运行过程中为局部变量分配的存储空间大小,它包括为参数表中值参变量分配的存储空间和为在函数体中定义的局部变量分配的存储空间两个部分。
若一个算法为递归算法,其空间复杂度为递归所使用的工作栈空间的大小,它等于一次调用所分配的临时存储空间的大小乘以被调用的次数(即为递归调用的次数加1,这个1表示开始进行的一次非递归调用)。