算法的漸進時間複雜度 簡稱時間複雜度
在常數操作數量的表達式中,
只要高階項,不要低階項,也不要高階項的係數,剩下的部分
如果記爲f(N),那麼時間複雜度爲O(f(N))
簡單來說就是大O表示法不考慮乘以、除以、加上、減去的數字
如O(n+26)、O(n-26)、O(n*26)、O(n/26)都可以表示爲O(n)
O(an^2+bn+c)表示爲O(n^2) 不考慮常數項 不考慮低階項
評價一個算法流程的好壞,先看時間複雜度的指標,然後再分
析不同數據樣本下的實際運行時間,也就是常數項時間(就是係數)。
大O表示法指出了算法有多快
大O表示法指出了最糟情況下的運行時間
算法的速度指的並非時間,而是操作數的增速
談論算法的速度時,我們說的是隨着出入的增加,其運行時間將以怎麼樣的速度增加
Demo1
如遍歷輸出一個數組 O(n)
如二分查找 O(log n) log n默認是以2爲底的 (在有序數組中每次取原來的一半,8個數就需要二分3次)
Demo2
繪製上述16個小方格
法一: 一個個畫,畫16個 O(n)
法二:依次對摺,只用對摺4次就能形成16個小方格 O(logn)
Demo3
流程1: O(M*N)
流程2: O(M*logN)
流程3: 類似外排的方法
1)排序 O(MlogM)
2) O(N+M)
總的複雜度: O(MlogM)+ O(N+M) 因爲N和M的大小不能確定,不能判斷MlogM和N的大小
流程2和3的選取根據樣本量的多少決定(根究N和M的大小)
附上流程3代碼:
public static void solution(int []A ,int[]B){
int N=A.length;
int M=B.length;
//先把M排序 快速排序的複雜度爲 O(MlogM)
quicksort(B,0,M-1);
int i=0;
int j=0;
while(i<N && j<M){
if(B[j]<A[i]){
System.out.println(B[j]);
j++;
}else if(B[j]==A[i]){
//do nothing
j++;
}
else if(B[j]>A[i]){
//do nothing
i++;
}
}
}
public static int partition(int []a,int low,int high){ //核心算法在分區,利用遞歸不斷縮小分區的區間,最終達到排序的目的
int i=low;
int j=high;
int pivotkey=a[low];
while(i<j){
while(i<j&&a[j]>=pivotkey){
j--;
}
a[i]=a[j]; //a[j]<pivotkey
while(i<j&&a[i]<=pivotkey){
i++;
}
a[j]=a[i]; //a[j]>pivotkey
}
a[i]=pivotkey; //基準歸位
return i;
}
public static void quicksort(int []a,int low,int high){
if(low<high){
int pivotkeyLocation=partition(a,low,high); //找到中軸
quicksort(a,low,pivotkeyLocation-1); //對中軸左邊的排序
quicksort(a,pivotkeyLocation+1,high); //對中軸右邊的排序
}
else {
return;
}
}
public static void main(String []args){
int []A={2,4,7,8,9}; //有序數組
int []B={1,9,7,8,4,5,6};
solution(A,B);
}
運行結果:
算法的存儲空間需求:
空間複雜度 算法所需存儲空間的度量 額外的的存儲空間
如創建一個臨時變量
如創建一個數組 ,或創建一個HashMap
都是算法消耗的額外存儲空間