大家都知道資料結構和英語,就如同程式設計師的兩條腿一樣;只有不斷的積累,學習,擁有了健壯的「雙腿」才能越走越遠;在資料結構和演算法的領域,不得不承認自己就是乙隻菜鳥;需要不斷的學習;在學習過程中,經常會有一些自己的看法,和別人獨特的見解;我都會一一做好筆記,以便進步;
1.資料結構和演算法解決是「如何讓計算機更快時間、更省空間的解決問題」,而時間、空間複雜度做為資料結構和演算法的精髓,很直觀說明了**」多快「」多省「。
2.我們可以從執行時間和占用空間來評估資料結構和演算法的效能,也就空間複雜度、時間複雜度,統稱為複雜度。
3.複雜度描述的是演算法執行時間(或占用空間)與資料規模的增長關係。
1.測試環境的不穩定因素(如同樣的**,i7比i3快得多),測試規模對測試結果影響很大(有些演算法更適用於大規模資料),複雜度分析有不依賴執行環境、成本低、效率高、易操作、指導性強的特點。
2.掌握複雜度分析,將能編寫出效能更優的**,有利於降低系統開發和維護成本。
1.大o表示法
1)所有**的執行時間 t(n) 與每行**的執行次數 n 成正比
其中t(n)表示演算法執行總時間,f(n)表示每行**執行總次數,而n往往表示資料的規模。
大 o 時間複雜度並不具體表示**真正的執行時間,而是表示**執行時間隨資料規模增長的變化趨勢,也叫作漸進時間複雜度,簡稱時間複雜度,
常量階、低階以及係數實際上對這種增長趨勢不產決定性影響,所以在做時間複雜度分析時忽略這些項。
2.複雜度分析法則
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.均攤時間複雜度:在**執行的所有複雜度情況中絕大部分是低階別的複雜度,個別情況是高階別複雜度且發生具有時序關係時,可以將個別高階別複雜度均攤到低級別複雜度上。基本上均攤結果就等於低級別複雜度。
二、為什麼要引入這4個概念?
1.同一段**在不同情況下時間複雜度會出現量級差異,為了更全面,更準確的描述**的時間複雜度,所以引入這4個概念。
2.**複雜度在不同情況下出現量級差別時才需要區別這四種複雜度。大多數情況下,是不需要區別分析它們的。
三、如何分析平均、均攤時間複雜度?
1.平均時間複雜度
**在不同情況下複雜度出現量級差別,則用**所有可能情況下執行次數的加權平均值表示。
2.均攤時間複雜度
兩個條件滿足時使用:1)**在絕大多數情況下是低級別複雜度,只有極少數情況是高階別複雜度;2)低級別和高階別複雜度出現具有時序規律。均攤結果一般都等於低級別複雜度。
我不認為是多此一舉,漸進時間,空間複雜度分析為我們提供了乙個很好的理論分析的方向,並且它是宿主平台無關的,能夠讓我們對我們的程式或演算法有乙個大致的認識,讓我們知道,比如在最壞的情況下程式的執行效率如何,同時也為我們交流提供了乙個不錯的橋梁,我們可以說,演算法1的時間複雜度是o(n),演算法2的時間複雜度是o(logn),這樣我們立刻就對不同的演算法有了乙個「效率」上的感性認識。
當然,漸進式時間,空間複雜度分析只是乙個理論模型,只能提供給粗略的估計分析,我們不能直接斷定就覺得o(logn)的演算法一定優於o(n), 針對不同的宿主環境,不同的資料集,不同的資料量的大小,在實際應用上面可能真正的效能會不同,個人覺得,針對不同的實際情況,進而進行一定的效能基準測試是很有必要的,比如在統一一批手機上(同樣的硬體,系統等等)進行橫向基準測試,進而選擇適合特定應用場景下的最有演算法。
綜上所述,漸進式時間,空間複雜度分析與效能基準測試並不衝突,而是相輔相成的,但是乙個低階的時間複雜度程式有極大的可能性會優於乙個高階的時間複雜度程式,所以在實際程式設計中,時刻關心理論時間,空間度模型是有助於產出效率高的程式的,同時,因為漸進式時間,空間複雜度分析只是提供乙個粗略的分析模型,因此也不會浪費太多時間,重點在於在程式設計時,要具有這種複雜度分析的思維。
小舟從此逝,江海寄餘生。 --狐狸
資料結構與演算法學習筆記之 複雜度分析
大家都知道資料結構和英語,就如同程式設計師的兩條腿一樣 只有不斷的積累,學習,擁有了健壯的 雙腿 才能越走越遠 在資料結構和演算法的領域,不得不承認自己就是乙隻菜鳥 需要不斷的學習 在學習過程中,經常會有一些自己的看法,和別人獨特的見解 我都會一一做好筆記,以便進步 1.資料結構和演算法解決是 如何...
《資料結構與演算法之美》學習筆記之複雜度
本系列是極客時間中前 google 工程師王爭 資料結構與演算法之美 專欄的學習筆記,想加強資料結構及演算法能力的同學可以直接購買此專欄,跳轉鏈結在此 複雜度分析是整個演算法學習的精髓,只要掌握了它,資料結構與演算法的內容基本上就掌握了一半 資料結構和演算法解決是如何讓計算機更快時間 更省空間的解決...
資料結構與演算法學習筆記1 複雜度
定義 演算法是用於解決特定問題的一系列的執行步驟 使用不同的演算法,解決同乙個問題,效率可能相差非常大,那麼我們應該如何評判乙個演算法的好壞呢?如果單從執行效率上進行評估,可能會想到這麼一種方案 比較不同演算法對同一組輸入的執行處理時間,這種方案也叫作 事後統計法 但是上述方案有比較明顯的缺點 我們...