1.資料結構和演算法本身解決的是「快」和「省」的問題,即如何讓**執行得更快,如何讓**更省儲存空間。執行效率是演算法乙個非常重要的考量指標。
2.因此需從執行時間和占用空間兩個維度來評估資料結構和演算法的效能。
3.分別用時間複雜度和空間複雜度兩個概念來描述效能問題,二者統稱為複雜度。
4.複雜度描述的是演算法執行時間(或占用空間)與資料規模的增長關係。
1.事後統計法:(1). 測試結果非常依賴測試環境;(2). 測試結果受資料規模的影響很大。時間、空間複雜度分析方法:乙個不用具體的測試資料來測試,就可以粗略地估計演算法的執行效率的方法。和效能測試相比,複雜度分析有不依賴執行環境、成本低、效率高、易操作、指導性強的特點。
2.掌握複雜度分析,將能編寫出效能更優的**,有利於降低系統開發和維護成本。
int
cal(
int n)
return sum;
}
假設每行**執行的時間都一樣,為 unit_time。第 2、3 行**分別需要 1 個 unit_time 的執行時間,第 4、5 行都執行了 n 遍,所以需要 2n*unit_time 的執行時間,所以這段**總的執行時間就是 (2n+2)*unit_time。
例2:
int
cal(
int n)
}}
假設每個語句的執行時間是 unit_time。那這段**的總執行時間 t(n) 是多少呢?第 2、3、4 行**,每行都需要 1 個 unit_time 的執行時間,第 5、6 行**迴圈執行了 n 遍,需要 2n * unit_time 的執行時間,第 7、8 行**迴圈執行了 n2遍,所以需要 2n2 * unit_time 的執行時間。所以,整段**總的執行時間 t(n) = (2n2+2n+3)*unit_time。
綜上可得:所有**的執行時間 t(n) 與每行**的執行次數 n 成正比,即:
其中,t(n) 表示**執行的時間;n 表示資料規模的大小;f(n) 表示每行**執行的次數總和(因為這是乙個公式,所以用 f(n) 來表示)。公式中的 o,表示**的執行時間 t(n) 與 f(n) 表示式成正比。
例1中 t(n) = o(2n+2),例2中t(n) = o(2n2+2n+3)。這就是大 o 時間複雜度表示法。
大 o 時間複雜度實際上並不具體表示**真正的執行時間,而是表示**執行時間隨資料規模增長的變化趨勢,所以,也叫作漸進時間複雜度(asymptotic time complexity),簡稱時間複雜度。
2)特點
以時間複雜度為例,由於時間複雜度描述的是演算法執行時間與資料規模的增長變化趨勢,所以常量階、低階以及係數實際上對這種增長趨勢不產決定性影響,所以在做時間複雜度分析時忽略這些項。
1)單段**看高頻:比如迴圈。
2)多段**取最大:比如一段**中有單迴圈和多重迴圈,那麼取多重迴圈的複雜度。
3)巢狀**求乘積:比如遞迴、多重迴圈等
4)多個規模求加法:比如方法有兩個引數控制兩個迴圈的次數,那麼這時就取二者複雜度相加。
多項式階:隨著資料規模的增長,演算法的執行時間和空間占用,按照多項式的比例增長。包括:
o(1)(常數階)、o(logn)(對數階)、o(n)(線性階)、o(nlogn)(線性對數階)、o(n2)(平方階)、o(n3)(立方階)
非多項式階:隨著資料規模的增長,演算法的執行時間和空間占用暴增,這類演算法效能極差。包括:
o(2^n)(指數階)、o(n!)(階乘階)
複雜度分析關鍵在於多練,所謂孰能生巧
資料結構之複雜度分析
目錄 1 為什麼需要複雜度分析?2 大o複雜度表示法 3 時間複雜度 3.1 只關注迴圈執行次數最多的一段 3.2 總的複雜度等於量級最大的那段 的複雜度 加法法則 3.3 巢狀 的複雜度等於巢狀內外 複雜度的乘積 乘法法則 3.4 時間複雜度 4 空間複雜度 5 時間複雜度擴充套件 網上一直有乙個...
資料結構時間複雜度分析
由於疫情原因,沒辦法去學校,資料結構也是看了很多遍,但知識點還是很容易忘,所以就用部落格的方式來記錄。對於一般演算法的時間複雜度,一般直接找到它的迴圈的次數即可,例 if a b else 對 a b 情況,最外層執行n 1次,內層執行最大執行次數為n 1 當i 0 時,所以o n n 對 a b ...
資料結構 複雜度分析(下)
1 最好情況時間複雜度 在最理想的情況下,執行這段 的時間複雜度 2 最壞情況時間複雜度 在最糟糕的情況下,執行這段 的時間複雜度 3 平均時間複雜度 加權平均時間複雜度或者期望時間複雜度 4 均攤時間複雜度 對乙個資料結構進行一組連續操作中,大部分情況下時間複雜度都很低,只有個別情況下時間複雜度比...