打算用1個月的時間,系統的學習一下清華大學鄧俊輝老師的《數據結構與算法》,不僅僅學習相關知識點,更想把握算法和數據結構的深刻內涵。
一.緒論
1.1 如何理解計算?
研究計算,在於挖掘其中的規律和技巧,實現更高效和低耗的計算,可以看作一個閉環。
下面這句話很好的闡述了計算的本質。所謂計算機科學其實可以被稱為計算的科學,計算機只是研究計算的手段,最終目的是為了研究計算中的規律和方法,實現更高效和低耗的計算。
computer science should be called computing science, for the same reason why surgery is not called knife science. -E.Dijkstra
具體來說,計算等同於信息處理,它的特點是借助某種工具,遵照一定規則,以明確而機械的形式展開。這種工具,就是計算機或者廣義的來說,就是信息處理工具。那么這種規則,狹義的可理解為算法,明確性和機械性也是算法的顯著特點。
展開來說,算法,也就是特定工具(計算機)下,旨在解決特定問題的指令序列。
它的主要特點如下:
- 輸入:待處理的問題
- 輸出:處理完的答案
- 正確性:確實可以解決指定的問題
- 確定性: 任意算法都可以描述為一個由基本操作組成的序列
- 可行性:每一個基本操作,都可以在常數時間內完成
- 有窮性:對於任何輸入,經又窮次基本操作,都可以得到輸出
對於有窮性可能不太直觀,舉一個有趣的例子
上面是一個Hailstone序列的一個表達式,從分段函數來看,很好理解。也可以很容易的編寫程序計算指定序列的個數。當然強調的不是這個,可以計算,Hailstone(7)時,其序列個數較大,而當Hailstone(27)時,其序列個數特別巨大, Hailstone(42)序列個數只有十余個。當n取不同值時,其序列長度並沒有明顯規律。事實上,研究者目前仍無法判定對於任意的n,Hailstone(n)到底是有窮的還是無窮的,顯然,這個程序由於不滿足有窮性,該程序並不是一個算法。
上面論述了算法的基本特點,那什么才是一個好算法?
如上圖,它得滿足正確性、健壯性、可讀性、效率。
這里說一下效率:
所謂效率,就是要求算法速度能盡可能的快,並且耗費存儲空間盡可能的小。也就是俗語說的”要想馬爾跑得快,還想馬爾不吃草“。也就是說,解決問題的程序是由算法和數據結構有機結合在一起的,但這並不能實現開頭所說的,高效和低耗的計算,還需要效率。也就是
(algorithm+structure)*efficiency=computation
1.2 算法的衡量
上節說到,算法和數據結構的有機結合,還需要進行效率的判斷,這樣才能實現高效和低耗的計算。
有句話很有意思,說明了衡量的重要性
To measure is to know ,If you can not measure it,you can not improve it. -Lord Kelvin
那么,如何衡量有效性呢?
暫時忽略掉存儲空間,從時間角度分析,如果將實例作為輸入,顯然不顯示,更好的策略是將規模作為輸入。
針對特定算法,不同實例:
將規模作為輸入也有缺陷,即同一問題同等規模的不用實例,其成本也不相同。因此可以轉而去求解所有實例中,成本最高的。
針對特定問題,不同算法:
顯然,為了給出客觀評價,抽象出一個理想的平台或模型比較可靠。
那么,圖靈機和寄存器就是這樣一個而理想的平台或者模型。
它將算法的運行時間具體到算法在圖靈機或者寄存器中需要操作的基本次數,這樣就可以客觀評價了。、
1.3 大O記號
如果將上一節的圖靈機或者寄存器比作直尺,則大O記號就是直尺上的刻度。需要強調的是,只需對大O表示的含義有一個宏觀的把控,看重長遠和潛力,即數據量更大的時候的表現,不要糾結細微不足和旁支末節。
在來一句有意思的話
Mathematics is more in need of good notations than of new theorems. -Alan Turing
對於多項式划重點:常數項可忽略,低次項可忽略!
大O基本上確定了f(n)的上界,還有其他的符號確定了下界,或者確定到一定范圍內。由於一般考慮最壞的情況,所以考慮上界。
1.3.1 常數時間復雜度分析
對於常數操作的時間復雜度比較好分析,但是應該注意一些特殊情況,如下,包含循環、分支、子函數調用甚至遞歸結極,但具有常數時間復雜度。
解答:
1.循環結構的遞增條件是1+n/2013,也就是說算法執行的次數不隨n變化,無論n怎么變,其都執行2013次,顯然雖然它具有循環結構,但是其仍然是常數時間復雜度。
2.其余的判斷條件無法滿足,即便其判斷內部的執行體有函數調用,遞歸等,其仍具有常數時間復雜度。
所以對於程序時間復雜度的估算,不能完全停留和依賴於其外在的流程結構;更為准確而精細的分析,必然需要以對其內在功能語義的充分理解為基礎。
1.3.2 對數時間復雜度分析
稍微解釋一下:
對於對數時間復雜度的分析,1.常底數無所謂,因為可以換底。2.常數次冪無所謂,可以前置。
c接近於0,那么這類算法時間復雜度則無限接近於常數
1.3.3 指數時間復雜度分析
指數算法的計算成本增長很快,通常認為不可接受。多項式到指數,是算法從有效到無效的一個分水嶺。
總的看一下吧:
o(1)<o(logn)<o(sqrt(n))<o(n)<o(nlogn)<o(n2)<o(n3)<o(2n)
總結
基本上是泛泛的談一下,還沒涉及到重點!本章還有1部分算法分析的內容,這是重點,過倆天更新。