时间复杂度
1.定义
算法的时间复杂度是一个函数,它定性描述了该算法的运行时间,时间复杂度是指执行算法所需要的计算工作量,简单来说,时间复杂度指的是语句执行次数。
2.计算方法
一般来说,用T(n)来描述语句具体执行次数,而用O(f(n))来描述时间复杂度。
常见的有O(1),O(n),O(log2n),O(2^n), O(n^2),O(n^3) ,,, O(n^k)
效率:О(1)< О(logn)< О(n)< О(nlogn) < О(n^ 2 )< О(n ^3 )< О(2^ n ) < О(n!)< О(n^n )
我们假设计算机运行一行基础代码需要执行一次运算。
int aFunc(void) {
printf("Hello, World!
"); // 需要执行 1 次
return 0; // 需要执行 1 次
}
那么上面这个方法需要执行 2 次运算
int aFunc(int n) {
for(int i = 0; i<n; i++) { // 需要执行 (n + 1) 次
printf("Hello, World!
"); // 需要执行 n 次
}
return 0; // 需要执行 1 次
}
这个方法需要 (n + 1 + n + 1) = 2n + 2 次运算。
需要注意两点,1.只保留最高项,2.将最高项的系数去除
如上例T(n)=2n+2,时间复杂度为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
//时间复杂度O(n^2)
空间复杂度
空间复杂度(Space Complexity)是对一个算法在运行过程中临时占用存储空间大小的量度,记做S(n)=O(f(n))。比如直接插入排序的时间复杂度是O(n^2),空间复杂度是O(1) 。而一般的递归算法就要有O(n)的空间复杂度了,因为每次递归都要存储返回信息。一个算法的优劣主要从算法的执行时间和所需要占用的存储空间两个方面衡量。