1.時間複雜度:這個是由流程決定的,那什麼叫做流程決定?就是看你是怎麼設計這套流程演算法的。舉例:如果你是直接根據下標索引直接找到資料,那麼你的時間複雜度就為o(1),而如果是迴圈遍歷比對找到資料,那麼你的時間複雜度就位o(n)
2.額外空間複雜度:這個也是由流程決定的。首先什麼叫做額外空間複雜度,就是在你使用這套流程完成具體功能的時候是否額外開闢了與實現這個功能無關的空間。
3.常數項時間:這個由具體細節決定,那什麼叫做具體細節?舉例來說就是,我們都知道位運算的效率是高於我們普通的加減乘除,如果你在實現過程中使用位運算的話,那麼你的常數項時間就會比較低,效率會比較高。
如何計算呢?
1.按照最差的情況統計計算
2.把整個流程拆分成乙個個基本動作,保證每個動作都是常數項操作。
3.將第二步拆分的動作求和,看是乙個什麼樣的基本表示式。
4.當完成了表示式的建立,只要把最高端項留下即可。低階項都去掉,高階項的係數也去掉。
看到上面計算的3點,我們來解釋下。
第一點,按照最差的情況統計計算
什麼才叫做最差的情況。舉例如下:比如插入排序過程中,我們知道每次都需要把區域性進行重新排序,那最好的情況是這個需要排序的資料是已經排好序的,那麼我們的時間複雜度就為o(1),但是我們不能因為這個就說插入排序的時間複雜度是o(n),我們要考慮的是最差的情況,最壞的情況是這個需要排序的資料的倒序的,那麼我們的時間複雜度就是o(n^2)了,在這裡大家可能還不知道o(n)是什麼概念,先了解下,下面有描述。
第二點,什麼叫做常數項操作。
定義如下:如果乙個操作的執行時間不以具體樣本量為轉移,每次執行時間都是固定時間。稱這樣的操作為常數時間的操作。
那有哪些操作是常數時間呢?
1.常見的算術運算(+、-、*、/、% 等)
2.常見的位運算(>>【帶符號右移】、>>>【不帶符號右移,最高位預設0,正數】、<<、|、&、^等)
3.賦值、比較、自增、自減操作等
4.陣列定址操作
總之,執行時間固定的操作都是常數時間的操作。
反之,執行時間不固定的操作,都不是常數時間的操作。
第三點:動作求和,看計算表示式結果
這裡需要我們把乙個流程拆分成乙個個基本動作,然後將整個過程求和。這麼說還是有點暈
這裡我們舉例選擇排序進行說明
過程:
arr[
0~n-
1]範圍上,找到最小值所在的位置,然後把最小值交換到0位置。 基本表示式為:(n-
1)(查詢資料+比較資料)
+1 #引數說明(n-
1)表示需要進行(n-
1)次的查詢資料和比較資料,因為查詢和比較是兩個常數項操作,所以這裡可以進步抽象為(n-1)
*2+1 最後係數1是交換位置,下面同理
arr[
1~n-
1]範圍上,找到最小值所在的位置,然後把最小值交換到1位置。基本表示式為:(n-2)
*2+1
arr[
2~n-
1]範圍上,找到最小值所在的位置,然後把最小值交換到2位置。基本表示式為:(n-3)
*2+1
…arr[n-
2~n-
1]範圍上,找到最小值位置,然後把最小值交換到n-
1位置。2+1
估算:很明顯,如果arr長度為n,每一步常數操作的數量,如等差數列一般
所以,總的常數運算元量 = a*
(n^2
)+ b*n + c (a、b、c都是常數)
所以選擇排序的時間複雜度為o
(n^2
)。
第四點,當完成表示式的建立後,只留下最高端
如上面第三點我們舉例的選擇排序為例,我們推算出選擇排序的表示式為形如:
a*(n^2) + b*n + c 那麼該演算法的
複雜度就為o(n^2)。記為:o(忽略掉係數的高階項)
這裡有疑問,為什麼最高端的係數可以忽略。理由是當你的樣本n數量趨向於無窮大,那麼高階前面的係數就無關緊要了。
常見的時間複雜度排名如下:
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!
)
概念如下:
你要實現乙個演算法流程,在實現演算法流程的過程中,你需要開闢一些空間來支援你的演算法流程。
理解:作為輸入引數的空間,不算額外空間。
作為輸出結果的空間,也不算額外空間。
因為這些都是必要的、和現實目標有關的。所以都不算。
但除此之外,你的流程如果還需要開闢空間才能讓你的流程繼續下去。這部分空間就是額外空間。
如果你的流程只需要開闢有限幾個變數,額外空間複雜度就是o(1)。
其實,演算法中重要的憑據點事時間複雜度,只有當時間複雜度相當,這個時候才會來考慮常數項時間。但是實際中,我們並不會直接去分析常數項。
原因有兩個:
第一:是常數項的操作都是固定的,但是卻又快慢之分,比如我在第1大點描述常數項的時候也說了,位運算會比普通的加減乘除快。
第二:理論分析,你需要分析的過程非常多。因為已經具體到細節部分了。所以直接交給實驗測試下,就知道優劣了,實踐是檢驗真理的唯一標準。
一般情況下,認為解決乙個問題的演算法流程,在時間複雜度的指標上,一定要盡可能的低,先滿足了時間複雜度最低這個指標之後,使用最少的空間的演算法流程,叫這個問題的最優解。
一般說起最優解都是忽略掉常數項這個因素的,因為這個因素只決定了實現層次的優化和考慮,而和怎麼解決整個問題的思想無關。
評估演算法的核心指標
1.時間複雜度 流程決定 2.額外空間複雜度 流程決定 3.常數項時間 實現細節決定 如果乙個操作的執行時間不以具體樣本量為轉移,每次執行時間都是固定時間,這樣的操作就是常數時間的操作。例如 在進行加法運算時,加法所用的時間與相加的兩個數字的大小是沒有關係的 取出陣列中第一千位置和一千億位置的數字,...
評估演算法的效能
我們要想去度量乙個演算法的效能,有多種方法,比如度量演算法的執行時間,統計指令,度量演算法所使用的記憶體等方法,下面我們乙個乙個的來解讀一下 度量演算法的執行時間的一種方法是,利用計算機自帶的乙個計時器,來獲取乙個迴圈所執行的執行時間,我們通過連續幾個迴圈的執行時間從而找出每乙個迴圈之間數字和時間的...
分類演算法評估指標
2 準確率 accuracy 準確率是常用的乙個評價指標,但是不適合樣本不均衡的情況。ac cura cy t p tn tp t n fp fn accuracy tp tn tp tn fp fnac cura cy t p tn tp t n fp fn 3 精確率 precision 又稱查...