时间复杂度与空间复杂度
众所周知我们一般从时间复杂度和空间复杂度两个角度评估算法的优劣
时间复杂度:指执行当前算法所消耗的时间,与算法中执行的次数成正比
常见的时间复杂度:
1)常数阶O(1)
public int sum(int a,int b){
return a + b;
}
2)线性阶O(n)
//这个代码会执行n次
public int sum(int n) {
int res = 0;
for (int i = 0; i < n; i++) {
res += n;
}
return res;
}
3)平方阶 O(n^2)
//双重循环即为n^2
public int sum(int n) {
int res = 0;
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
res += j;
}
}
return res;
}
4)对数阶O(log n)
//二分查找
public static ArrayList<Integer> binarySearch(int[] arr,int findVal){
ArrayList<Integer> re = null;
int mid = (arr.length - 1) / 2;
int left = 0;
int right = arr.length -1;
while (left <= right){
if(arr[mid] > findVal){//在左边
right = mid -1;
mid = (left + right) / 2;
}else if(arr[mid] < findVal){//在右边
left = mid +1;
mid = (left + right) / 2;
}else {//找到了,之后考虑存在多个要寻找的值的情况
re = new ArrayList<>();
re.add(mid);
//向左遍历
for (int i =mid - 1 ; i >= left ; i--) {
if(arr[i] == findVal) re.add(i);
}
//向右遍历
for (int i = mid +1 ; i <= right ; i++) {
if(arr[i] == findVal) re.add(i);
}
break;
}
}
return re;
}
5)线性对数阶O(nlog n)
//将复杂度为log n的算法重复n次即可
public static void binarySearchN(int[] arr,int findVal){
for (int i = 0; i < arr.length; i++) {
binarySearch3(arr,findVal);
}
}