算法(Algorithm)
是指用来操作数据、解决程序问题的一组方法。
不同的算法能得出相同的结果,但是不同的算法所需要消耗的时间和空间是不一样的,所以我们对于算法优劣的衡量主要是从算法所占用的「时间」和「空间」两个维度去考量。
时间维度:是指执行当前算法所消耗的时间,我们通常用「时间复杂度」来描述。
空间维度:是指执行当前算法需要占用多少内存空间,我们通常用「空间复杂度」来描述。
对于时间维度:
「 大O符号表示法 」,即 T(n) = O(f(n))。
- 常数阶O(1) --------(普通操作)
int a=10;
int b=10;
a=a+b;
- 线性阶O(n)--------(一层for循环)
int sum;
for(int i=0;i<n;i++){
sum += i;
}
- 平方阶O(n²)--------(两层for循环)
//输入int a[n][n]
int sum;
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
sum += a[i][j];
}
}
- 对数阶O(logn)--------(成 2 倍数的缩减搜索范围)----(二分查找)
int binarySearch( int arr[], int n , int target){
int l = 0, r = n - 1;
while ( l <= r) {
int mid = l + (r - l) / 2;
if (arr[mid] == target) return mid;
if (arr[mid] > target ) r = mid - 1;
else l = mid + 1;
}
return -1;
}
对于空间复杂度
一个程序的空间复杂度是指运行完一个程序所需内存的大小。
一个算法所需的存储空间用f(n)表示。S(n)=O(f(n)),其中n为问题的规模,S(n)表示空间复杂度。
总结
对于一个算法而言,时间与空间是可以相互转换的。比如我们常说的用空间换时间–哈希表
建立一个更大的空间去节约时间。所以我们在使用算法的时候往往需要综合考虑时间与空间的复杂度,选择更优的算法。