时间复杂度
用于表示,算法解决规模为n的问题所消耗的时间。
理解:用同一代码块段执行的次数衡量
sum = n*(n+1)/2; //顺序执行时,此代码块只会运行一次因此时间复杂度为 O(1)
for(int i = 0; i < n; i++){
printf("%d ",i); //根据上面的理解它的时间复杂度O(n)
}
有些时候为了表示方便也会取近似值如:
for(int i = 0; i < n; i++){
for(int j = 0; j < n; j++){
printf("%d ",i); //准确的时间复杂度为O(n^2)
}
}
但
for(int i = 0; i < n; i++){
for(int j = i; j < n; j++){
printf("%d ",i);//此代码块运行次数为 (1+n)*n/2
//由高数中的极限可推n无限大时,(1+n)*n/2极限为n^2,因此时间复杂度O(n^2)
}
}
那 log2n是怎么出现的
int i = 1, n = 100;
while(i < n){
i = i * 2; //设执行次数为x。 2^x = n 即x = log_2 n,时间复杂度O(log2n)
//当循环步数不为1跳跃时,便会产生多种答案
}
参考 时间复杂度和空间复杂度
空间复杂度
用于表示,算法解决规模为n的问题所消耗的空间。
理解:生成额外空间的数量(临时变量在内)
public static void swap(int a, int b) {
int temp = a;
a = b;
b =temp;
}
一个简单交换的完成,借助了一个临时变量temp才得以完成,所以空间复杂度为O(1)
public static void swap(int a, int b) {
a = a+b;
b = a-b;
a = a-b;
}
而使用加减法交换就不会产生临时变量因此空间复杂度为O(0)
网友评论