為什麼需要複雜度分析
事後統計法:把**跑一遍,通過統計、監控來得到演算法執行的時間和占用的記憶體大小。
缺點:1.測試結果非常依賴測試環境
測試環境中的硬體不同會導致測試結果也不同。
2.測試結果受資料規模的影響很大
資料規模太大,測試**需要花費的時間就太多了;資料規模太小,反映不出演算法的真實性能;對於排序演算法,待排序的資料的初始有序度也會影響測試結果。
大o複雜度表示法:
原理:所有**的執行時間t(n)與每行**的執行次數n成正比
公式:t(n)=o(f(n))
n表示資料規模的大小;f(n)表示每行**執行的次數總和;o表示執行時間t(n)與f(n)表示式成正比。
注: 大o時間複雜度實際上並不表示**真正的執行時間,而是**執行時間隨資料規模增長的變化趨勢,也稱作漸進時間複雜度。
時間複雜度分析:
由於時間複雜度表示的是**執行時間隨資料規模的增長的變化趨勢,所以常量階、低階以及係數對增長趨勢並無決定性影響,所以可以忽略不計。
分析法則:
1.單段**看高頻:比如迴圈
2.多段**取最大:比如一段**中有單迴圈和多重迴圈,那麼取多重迴圈的複雜度
3.巢狀**求乘積:如遞迴、多重迴圈
4.多個規模求加法:比如方法中有兩個引數控制兩個迴圈的次數,就取兩者複雜度之和
常用的複雜度級別:
多項式階:隨著資料規模的增長,演算法的執行時間和空間占用,按照多項式的比例增長。包括:
o(1)常數階、o(logn)對數階、o(n)線性階、o(nlogn)線性對數階、o(n2)平方階、o(n3)立方階
非多項式階:隨著資料規模的增長,演算法的執行時間和空間占有暴增,這類演算法效能極差。包括:
o(2n)指數階、o(n!)階乘階
如何掌握複雜度分析方法:多練,孰能生巧
資料結構與演算法之美 學習心得系列一
本來打算貼上極客時間的目錄,結果發現太長了。影響到閱讀,何況我並不是為了宣傳極客時間的專欄。作為一名軟體工程師,為什麼要學習資料結構和演算法?看到這個標題,我打算先不看文章,先自己反思一下。自己寫程式多年,發現在做很多專案的時候被演算法限制了自己的發揮,很多實現明明知道應該有更好的辦法,但是就是無法...
《資料結構與演算法之美》學習筆記 3 資料結構
陣列定義 陣列 array 是一種線性表資料結構。它用一組連續的記憶體空間,來儲存一組具有相同型別的資料。第一是線性表 linear list 顧名思義,線性表就是資料排成像一條線一樣的結構。每個線性表上的資料最多只有前和後兩個方向。除了陣列,鍊錶 佇列 棧等也是線性表結構。而與它相對立的概念是非線...
《資料結構與演算法之美》學習筆記之開篇
本系列是極客時間中前 google 工程師王爭 資料結構與演算法之美 專欄的學習筆記,想加強資料結構及演算法能力的同學可以直接購買此專欄,跳轉鏈結在此 從廣義上講,資料結構就是指一組資料的儲存結構。演算法就是運算元據的一組方法。資料結構和演算法是相輔相成的。資料結構是為演算法服務的,演算法要作用在特...