資料結構和演算法的終極目標是「快」和「省」,衡量**的執行效率,最直接的方法就是把**跑一遍,通過統計、監控就能得到演算法的執行時間和占用記憶體的情況。但是這樣做的問題是測試結果非常依賴測試環境以及測試結果受規模的影響很大。同樣的**,在i3和i7上跑,執行的時間明顯不一樣。即使在同一臺機器上跑,同樣的**得出的統計、監控結果也可能不一樣,而且,當有多種演算法可供選擇時,總不能把每種演算法都跑一遍,選擇最優演算法吧?
借助演算法分析,就可以不用跑**,實現粗略估計**執行效率的目標。
時間複雜度用來分析**的執行時間,用大o表示
private function cal(n:int):int
return sum;
}
這段**每一行都在執行讀資料-運算-寫資料的類似操作,用來粗略估計時,可視為每行**的執行時間為單位時間。
for迴圈執行++i和sum = sum+i;,所以每執行一次for迴圈,消耗2個單位時間。再加上進入for迴圈之前消耗的2個單位時間,故這段**消耗的時間可以粗略視為2n+2個單位時間
用大o時間複雜度表示法可以寫成t(n) = o(2n+2),表示的並不是**的真正執行時間,表示的是**執行時間隨資料規模增長的變化趨勢,也叫漸近時間複雜度,簡稱時間複雜度。當n很大時,前面的係數可以忽略,所以可以記為t(n) = o(n);
幾種常見的時間複雜度
o(1)當**的複雜度由兩個資料規模決定,而這兩個資料規模的大小又不能確定時,例如o(m)、o(n),不能確定m、n的大小關係,
這是時間複雜度的寫法為t(n) = o(m+n)
時間複雜度分析分為
最好情況時間複雜度:在理想情況下,執行這段**的時間複雜度
最壞情況時間複雜度:在最糟糕的情況下,執行這段**的時間複雜度
平均情況時間複雜度:加權平均時間複雜度、期望時間複雜度
均攤時間複雜度:一種特殊的平均時間複雜度
空間複雜度表示演算法的儲存空間與資料規模之間的增長關係,全稱漸近空間複雜度,簡稱空間複雜度。
常見的空間複雜度o(1)、o(n)、o(n^2),對於o(log n)、o(n log n)對數階空間複雜度,很少遇到
雖然**中已經進行了複雜度分析,但是測試時仍然需要進行效能測試,因為複雜度分析只是提供了乙個理論分析,與平台無關,通過效能測試可以幫助選擇特定場景下的最優演算法。
演算法複雜度分析
分析非遞迴演算法效率的通用方案 1.決定用哪個 哪些 引數作為輸入規模的度量 2.找出演算法的基本操作 作為一規律,它總是位於演算法的最內層迴圈中 3.檢查基本操作的執行次數是否只依賴輸入規模。如果它還依賴一些其他的特性,則最差效率 平均效率以及最優效率 如果必要 需要分別研究。4.建立乙個演算法基...
演算法複雜度分析
演算法分析的四個漸進表示法 一般,o裡的,取最小的 一般,裡的,取最大的 一般分析時間複雜度,且常考慮最壞複雜度,常用o分析 三法則 法則一 如果t1 n o f n t2 n0 o g n t1 n t2 n max o f n o g n t1 n t2 n o f n o g n 法則二 如果...
演算法複雜度分析
類別name 名字交換類排序 quicksort 快速排序 交換類排序 bubble sort 氣泡排序 選擇類排序 selection sort 選擇排序 選擇類排序 heapsort 堆排序插入類排序 insertion sort 插入排序 插入類排序 shell sort 希爾排序 bucke...