时间复杂度:
(1)时间频度
一个算法中的语句执行次数称为语句频度或时间频度。记为T(n)。
n称为问题的规模,当n不断变化时,时间频度T(n)也会不断变化。
(2)时间复杂度
一般情况下,算法中基本操作重复执行的次数是问题规模n的某个函数,用T(n)表示,若有某个辅助函数f(n),使得当n趋近于无穷大时,T(n)/f(n)的极限值为不等于零的常数,则称f(n)是T(n)的同数量级函数。记作T(n)=O(f(n)),称O(f(n)) 为算法的渐进时间复杂度,简称时间复杂度。
按数量级递增排列,常见的时间复杂度有:常数阶O(1),对数阶O(log2n),线性阶O(n), 线性对数阶O(nlog2n),平方阶O(n2),立方阶O(n3),…, k次方阶O(nk),指数阶O(2n)。算法中语句执行次数为一个常数,则时间复杂度为O(1)
(3)时间复杂度的取值
主要用算法时间复杂度的数量级评价一个算法的时间性能。
时间复杂度的计算:
计算出基本操作的执行次数T(n)
基本操作即算法中的每条语句(以;号作为分割),语句的执行次数也叫做语句的频度。在做算法分析时,一般默认为考虑最坏的情况。计算出T(n)的数量级
求T(n)的数量级,只要将T(n)进行如下一些操作:
忽略常量、低次幂和最高次幂的系数
令f(n)=T(n)的数量级。用大O来表示时间复杂度
当n趋近于无穷大时,如果lim(T(n)/f(n))的值为不等于0的常数,则称f(n)是T(n)的同数量级函数。记作T(n)=O(f(n))。
例:
int num1, num2;
for(int i=0; i<n; i++){
num1 += 1;
for(int j=1; j<=n; j++){
num2 += num1;
}
}
分析:
每条语句(以;号作为分割)
1.常量:语句int num1, num2;
语句条数:2
频度:1
低次幂:语句i < n; i ++; num1 += 1; j=1
语句条数:4
频度:n
高次幂
语句j<=n; j++; num2+=num1;的频度为n*n;
语句条数:3
频度:n*n
T(n) = 2 + 4n + 3n*n
2.
忽略掉T(n)中的常量、低次幂和最高次幂的系数
f(n) = n*n = n2
3.
T(n) = O(n2)
空间复杂度:
空间复杂度与时间复杂度类似,空间复杂度是指算法在计算机内执行时所需存储空间的度量。记作: S(n)=O(f(n))
空间复杂度(Space Complexity)是对一个算法在运行过程中临时占用存储空间大小的量度。一个算法在计算机存储器上所占用的存储空间,包括存储算法本身所占用的存储空间,算法的输入输出数据所占用的存储空间和算法在运行过程中临时占用的存储空间这三个方面。
其中,对于输入数据所占用的具体存储量取决于问题本身,与算法无关,这样只需要分析该算法在实现时所需要的辅助空间单元个数即可。
当一个算法的空间复杂度为一个常量,即不随被处理数据量n的大小而改变时,可表示为O(1)。
算法1:
for(i=0;i<n;i++){
b[i]=a[n-i-1];
}
for(i=0;i<n;i++){
a[i]=b[i]//数组b为中间过渡所需要
}
算法2:
for(i=0;i<n/2;i++){
t=a[i];
a[i]=a[n-i-1];
a[n-i-1]=t;//变量t为中间过渡所需要
}
算法1的空间复杂度为O(n),需要一个大小为n的辅助数组b。
算法2的空间复杂度为O(1),需要一个变量t,与问题规模无关。