你們都知道數據結構和英語,就如同程序員的兩條腿同樣;只有不斷的積累,學習,擁有了健壯的「雙腿」才能越走越遠;在數據結構和算法的領域,不得不認可本身就是一隻菜鳥;須要不斷的學習;在學習過程當中,常常會有一些本身的見解,和別人獨特的看法;我都會一一作好筆記,以便進步;html
1.數據結構和算法解決是「如何讓計算機更快時間、更省空間的解決問題」,而時間、空間複雜度作爲數據結構和算法的精髓,很直觀說明了代碼」多快「」多省「。程序員
2.咱們能夠從執行時間和佔用空間來評估數據結構和算法的性能,也就空間複雜度、時間複雜度,統稱爲複雜度。算法
3.複雜度描述的是算法執行時間(或佔用空間)與數據規模的增加關係。 編程
1.測試環境的不穩定因素(如一樣的代碼,i7比i3快得多),測試規模對測試結果影響很大(有些算法更適用於大規模數據),複雜度分析有不依賴執行環境、成本低、效率高、易操做、指導性強的特色。數據結構
2.掌握複雜度分析,將能編寫出性能更優的代碼,有利於下降系統開發和維護成本。 數據結構和算法
1)全部代碼的執行時間 T(n) 與每行代碼的執行次數 n 成正比 性能
其中T(n)表示算法執行總時間,f(n)表示每行代碼執行總次數,而n每每表示數據的規模。學習
大 O 時間複雜度並不具體表示代碼真正的執行時間,而是表示代碼執行時間隨數據規模增加的變化趨勢,也叫做漸進時間複雜度,簡稱時間複雜度,測試
常量階、低階以及係數實際上對這種增加趨勢不產決定性影響,因此在作時間複雜度分析時忽略這些項。spa
1)單段代碼看高頻:好比循環。
2)多段代碼取最大:好比一段代碼中有單循環和多重循環,那麼取多重循環的複雜度。
3)嵌套代碼求乘積:好比遞歸、多重循環等
4)多個規模求加法:好比方法有兩個參數控制兩個循環的次數,那麼這時就取兩者複雜度相加。
多項式階:隨着數據規模的增加,算法的執行時間和空間佔用,按照多項式的比例增加。包括, O(1)(常數階)、O(logn)(對數階)、O(n)(線性階)、O(nlogn)(線性對數階)、O(n^2)(平方階)、O(n^3)(立方階)
非多項式階:隨着數據規模的增加,算法的執行時間和空間佔用暴增,這類算法性能極差。包括, O(2^n)(指數階)、O(n!)(階乘階)
複雜度分析關鍵在於多練,所謂孰能生巧。
1.最壞狀況時間複雜度:代碼在最理想狀況下執行的時間複雜度。
2.最好狀況時間複雜度:代碼在最壞狀況下執行的時間複雜度。
3.平均時間複雜度:用代碼在全部狀況下執行的次數的加權平均值表示。
4.均攤時間複雜度:在代碼執行的全部複雜度狀況中絕大部分是低級別的複雜度,個別狀況是高級別複雜度且發生具備時序關係時,能夠將個別高級別複雜度均攤到低級別複雜度上。基本上均攤結果就等於低級別複雜度。
1.同一段代碼在不一樣狀況下時間複雜度會出現量級差別,爲了更全面,更準確的描述代碼的時間複雜度,因此引入這4個概念。
2.代碼複雜度在不一樣狀況下出現量級差異時才須要區別這四種複雜度。大多數狀況下,是不須要區別分析它們的。
1.平均時間複雜度
代碼在不一樣狀況下複雜度出現量級差異,則用代碼全部可能狀況下執行次數的加權平均值表示。
2.均攤時間複雜度
兩個條件知足時使用:1)代碼在絕大多數狀況下是低級別複雜度,只有極少數狀況是高級別複雜度;2)低級別和高級別複雜度出現具備時序規律。均攤結果通常都等於低級別複雜度。
我不認爲是畫蛇添足,漸進時間,空間複雜度分析爲咱們提供了一個很好的理論分析的方向,而且它是宿主平臺無關的,可以讓咱們對咱們的程序或算法有一個大體的認識,讓咱們知道,好比在最壞的狀況下程序的執行效率如何,同時也爲咱們交流提供了一個不錯的橋樑,咱們能夠說,算法1的時間複雜度是O(n),算法2的時間複雜度是O(logN),這樣咱們馬上就對不一樣的算法有了一個「效率」上的感性認識。
固然,漸進式時間,空間複雜度分析只是一個理論模型,只能提供給粗略的估計分析,咱們不能直接判定就以爲O(logN)的算法必定優於O(n), 針對不一樣的宿主環境,不一樣的數據集,不一樣的數據量的大小,在實際應用上面可能真正的性能會不一樣,我的以爲,針對不一樣的實際狀況,進而進行必定的性能基準測試是頗有必要的,好比在統一一批手機上(一樣的硬件,系統等等)進行橫向基準測試,進而選擇適合特定應用場景下的最有算法。
綜上所述,漸進式時間,空間複雜度分析與性能基準測試並不衝突,而是相輔相成的,可是一個低階的時間複雜度程序有極大的可能性會優於一個高階的時間複雜度程序,因此在實際編程中,時刻關心理論時間,空間度模型是有助於產出效率高的程序的,同時,由於漸進式時間,空間複雜度分析只是提供一個粗略的分析模型,所以也不會浪費太多時間,重點在於在編程時,要具備這種複雜度分析的思惟。
歡迎你們關注公衆號,不定時乾貨,只作有價值的輸出
做者:Dawnzhang
出處:http://www.javashuo.com/article/p-qaqgcitp-gd.html 版權:本文版權歸做者轉載:歡迎轉載,但未經做者贊成,必須保留此段聲明;必須在文章中給出原文鏈接;不然必究法律責任