時間復雜度(流程決定)
額外空間復雜度(流程決定)
常數項時間(實現細節決定)
什么是時間復雜度?時間復雜度怎么估算?
•常數時間的操作
•確定算法流程的總操作數量與樣本數量之間的表達式關系
•只看表達式最高階項的部分
常見的常數時間的操作
總之,執行時間固定的操作都是常數時間的操作。
反之,執行時間不固定的操作,都不是常數時間的操作
選擇排序
過程:
arr[0~N-1]范圍上,找到最小值所在的位置,然后把最小值交換到0位置。
arr[1~N-1]范圍上,找到最小值所在的位置,然后把最小值交換到1位置。
arr[2~N-1]范圍上,找到最小值所在的位置,然后把最小值交換到2位置。
…
arr[N-1~N-1]范圍上,找到最小值位置,然后把最小值交換到N-1位置。
估算:
很明顯,如果arr長度為N,每一步常數操作的數量,如等差數列一般
所以,總的常數操作數量 = a(N^2) + bN + c (a、b、c都是常數)
所以選擇排序的時間復雜度為O(N^2)。
冒泡排序
過程:
在arr[0~N-1]范圍上:
arr[0]和arr[1],誰大誰來到1位置;arr[1]和arr[2],誰大誰來到2位置…arr[N-2]和arr[N-1],誰大誰來到N-1位置
在arr[0~N-2]范圍上,重復上面的過程,但最后一步是arr[N-3]和arr[N-2],誰大誰來到N-2位置
在arr[0~N-3]范圍上,重復上面的過程,但最后一步是arr[N-4]和arr[N-3],誰大誰來到N-3位置
…
最后在arr[0~1]范圍上,重復上面的過程,但最后一步是arr[0]和arr[1],誰大誰來到1位置
估算:
很明顯,如果arr長度為N,每一步常數操作的數量,依然如等差數列一般
所以,總的常數操作數量 = a(N^2) + bN + c (a、b、c都是常數)
所以冒泡排序的時間復雜度為O(N^2)。
插入排序
過程:
想讓arr[0~0]上有序,這個范圍只有一個數,當然是有序的。
想讓arr[0~1]上有序,所以從arr[1]開始往前看,如果arr[1]<arr[0],就交換。否則什么也不做。
想讓arr[0~i]上有序,所以從arr[i]開始往前看,arr[i]這個數不停向左移動,一直移動到左邊的數字不再比自己大,停止移動。
最后一步,想讓arr[0~N-1]上有序, arr[N-1]這個數不停向左移動,一直移動到左邊的數字不再比自己大,停止移動。
估算時發現這個算法流程的復雜程度,會因為數據狀況的不同而不同。
最差的情況時間復雜度為O(N^2)。
額外空間復雜度
實現一個算法流程,在實現算法流程的過程中,你需要開辟一些空間來支持你的算法流程。
作為輸入參數的空間,不算額外空間。
作為輸出結果的空間,也不算額外空間。
因為這些都是必要的、和現實目標有關的。所以都不算。
但除此之外,你的流程如果還需要開辟空間才能讓你的流程繼續下去。這部分空間就是額外空間。
常見的時間復雜度
排名從好到差:
O(1)
O(logN)
O(N)
O(N*logN)
O(N^2) O(N^3) … O(N^K)
O(2^N) O(3^N) … O(K^N)
O(N!)
