一.大O渐进法(表示为O())
1.用常数1取代运行时间中的所有加法常数。
2.在修改后的运行次数函数中,只保留最高阶项。
3.如果最高阶项存在且不是1,则除去与这个项目相乘的常数,得到的结果就是大O阶。
二.在一个长度为N的数组中搜索一个数据x
最坏情况:N次找到
最好情况:1次找到
平均情况:N/2次找到
三.举例
计算func的时间复杂度
void func(int N,int M){
intt count = 0;
for(int k = 0; k<M; k++){
count++;
}
for(int k = 0; k<N; k++){
count++;
}
System.out.println(count);
}
//时间复杂度(最坏情况)为O(M+N)
计算binarySearch(二分查找)的时间复杂度
int binarySearch(int[] array,int value){
int begin = 0;
int end = array.length - 1;
while(begin <= end){
int mid = begin+((end-begin)/2);
if(array[mid]<value)
begin = mid+1;
else if(array[mid]>value)
end = mid-1;
else
return mid;
}
return -1;
}
时间复杂度:N/2^X = 1
2^X=n
x=logn
阶乘递归的时间复杂度:O(N)
斐波那契的时间复杂度: O(2^N)
int fibonacci(int N){
return N<2 ? fibonacci(N-1)+fibonacci(N-2);
}
四.复杂度由低到高:O(1) O(N) O(logN) O(NlogN) O(N^2)
空间复杂度
当算法的存储空间大小固定,和输入规模没有直接的关系时,空间复杂度记作O(1)。
int m = 2;
是一个线性的集合(如数组),空间复杂度记作 O(n)。
int[] array = new int[n]
当算法分配的空间是一个二维数组集合,空间复杂度记作 O(n*m)。
int[][] arr = new int[n][m];