时间复杂度对应语句执行的次数(而不是具体语句的复杂度),空间复杂度对应算法占用的存储空间
时间复杂度有以下经验规则:
O(1)<O(log2^n)<O(n)<O(n*log2^n)<O(n^2)<O(n^3)<O(2^n)<O(3^n)<O(n!)
前四个比较好,中间两个一般,后三个很烂。
求解时间复杂度的具体步骤:
1.找出算法中的基本语句,即执行次数最多的那条语句,一般为最内层循环的循环体;
2.计算基本语句执行次数的数量级,只需保证最高次幂正确即可,去除最高次幂的系数
(如果算法中包含嵌套的循环,则基本语句通常是最内层的循环体,如果算法中包含并列的循环,则将并列循环的时间复杂度相加。如:
for (i=1; i<=n; i++)
x++;
for (i=1; i<=n; i++)
for (j=1; j<=n; j++)
x++;
第一个for循环的时间复杂度为O(n),第二个for循环的时间复杂度为O(n^2),则:
O(n)+O(n^2)=O(n^2+n)=O(n^2))
O(1)表示基本语句的执行次数是一个常数,一般来说,只要算法中不存在循环语句,其时间复杂度就是O(1);其中O(log2^n)、O(n)、O(nlog2^n)、O(n^2)、和O(n^3)称为多项式时间,而O(2^n)和O(n!)称为指数时间。计算机科学家普遍认为前者(即多项式时间复杂度的算法)是有效算法,把这类问题称为P(Polynomial,多项式)类问题,而把后者(即指数时间复杂度的算法)称为NP(Non-Deterministic Polynomial,非确定多项式)问题。
注:
如果算法的执行时间不随着问题规模n的增加而增长,即使算法中有上千条语句,其执行时间也不过是一个较大的常数。此类算法的时间复杂度是O(1)。
举例:
i = 1;
while(i <= n)
i = i*2; //循环语句
设循环语句的频度为f(n),则2^f(n)<=n,即f(n)<=log2^n,取最大值,f(n)=log2^n,T(n)=O(log2^n);
一个算法在计算机存储器上所占用的存储空间,包括存储算法本身所占用的存储空间、算法的输入输出数据所占用的存储空间和算法在运行过程中临时占用的存储空间这三个方面;
对于一个算法来说,空间复杂度和时间复杂度往往是相互影响的。当追求一个较好的时间复杂度时,可能会使空间复杂度性能变差,即可能导致占用较多的存储空间;反之,当追求一个较好的空间复杂度时,可能会使时间复杂度的性能变差,即可能导致占用较长的运行时间。