目录
例题
算法1
算法2
分析算法时间复杂度的基本方法
1.找出语句频度最大的那条语句作为基本语句。
2.计算基本语句的频度得到问题规模n的某个函数f(n)。
3.取其数量级用符号“O”表示。
例题
分析以下程序段的时间复杂度
i = 1; // ①
while(i <=n)
i = i*2; // ②
关键是要找出来执行 次数x与n的关系,并表示称n的函数:
若循环执行1次:i=1*2=2,
若循环执行2次:i=2*2=2^2^,
若循环执行3次:i=2*2*2=2^3^,
若循环执行x次:i=2*2*...=2^x^,
设语句②执行次数为x次,由循环条件i<=n可得,2^x^<=n,所以x<=log2n
即f(n)≤log2n,取最大值f(n)=log2n,所以该程序段的时间复杂度T(n)=O(log2n)
算法时间复杂度计算
请注意:有的情况下,算法中基本操作重复执行的次数还随问题的输入、数据集不同而不同。
例如,顺序查找,在数组a[i]中查找值等于e的元素,返回其所在位置。
for (i=0; i<n; i++)
if(a[i] ==e) return i+1; // 找到,则返回是第几个元素
return 0;
最好情况:1次
最坏情况:n次
平均时间复杂度为:O(n)
算法空间复杂度
算法1
for(i=0;i<n/2;i++) {
t=a[i];
a[i]=a[n-i-1];
a[n-i-1]=t;
}
只额外创建了一个t变量,
S(n)=O(1),原地工作。
算法2
for(i=0;i<n;i++)
b[i]=a[n-i-1];
for(i=0;i<n;i++
a[i]=b[i];
额外创建了b[i],所以S(n)=O(n)。