數據結構與算法系列------算法

    hello,everybody.今天咱們來總結一下《大話數據結構》第二章----算法。那麼首先,讓咱們一塊兒回憶一下書籍目錄關於第二章的內容吧。算法

算法數據結構

1.數據結構與算法的關係函數

2.兩種算法的對比學習

3.算法的定義spa

4.算法的特性設計

5.算法設計的要求3d

6.算法效率的度量方法blog

7.函數的漸近增加內存

8.算法時間複雜度get

9.常見的時間複雜度

10.最壞狀況與平均狀況

11.算法空間複雜度

以上就是算法的所涉及的十個概念,咱們的總結也是按照以上是十個概念來進行的。那麼咱們one by one 來進行學習吧。

First,數據結構與算法的關係:

書中是用一個現實問題來解答兩者之間的關係,假設你與你的girlfriend 一塊兒去看愛情話劇《Romeo and Juliet(羅密歐與朱麗葉)。到了影院,發現海報上寫的是《Romeo》,本覺得是工做人員粗枝大葉寫錯了。後來才知道,原來美麗的Juliet不滿本身報酬,因此就不肯意出席。沒有Juliet,那麼只能演Romeo的心理路程了。我是這麼來理解算法與數據結構的關係的,好的算法是爲了數據能夠更高效的在計算機中存儲。數據結構,算法能夠單獨拿出來說,來學,來用。可是顯然,意義不是很大。選擇好的數據結構,來存儲數據,選擇好的算法來計算數據。目的都是爲了讓計算機能夠高效運做。

Second,兩種算法的比較:

高斯,是德國的著名數學家。提及來慚愧,關於等差數列,只知道有這麼個東西,哇曉得它的歷史。高斯上小學時,有一天班裏同窗不遵照紀律,惹得老師發怒。放學後,老師出了一道數學題,答出題目的同窗才能夠放學。題目是這樣的:1+2+3+4+………100

同窗們埋頭在計算題目,不到一分鐘,咱們的天才數學家就把答案計算出來了,老師都感到難以想象(由於當時等差數列求和尚未誕生)。他的思路是這樣的:

sum=1+2+3+4+………..+97+98+99+100

sum2=100+99+98+97+……+4+3+2+1

2*sum=sum+sum1(100個101)=10100

sum=sum+sum1/2=5050

等差數列求和的公式:(首項+末項)*項數/2

看一下,下面的兩種算法。

int I;int sum=0;int n=100;

for(i=1;i<=n;i++)

{

      sum+=sum+I;

}

 

int i=1,;int sum=0;int n=100;

sum=(i+n)*n/2

 

你們體會到不一樣的算法的區別了麼?因此,研究算法是很重要的。好算法濃縮都是智慧,都是知識。

Third,算法的定義:

何爲算法?算法,解決問題,咱們須要解決方案。具體的解決方案須要詳細的步驟,方法。算法,就是這些步驟,方法的集合。對應到計算機中,就是一條條指令的集合。Note:一條指令可能包含多部操做。

Fourth,算法的特性:

算法具備她本身的一些特性,(1)有窮性:咱們寫出來的算法必定要保證是能夠在必定時間內執行完的。(2)輸出性:咱們寫出的算法必定要有輸出,沒有輸出的話,那麼這個算法也沒有存在的意義。(3)輸入性:大部分算法是須要輸入參數的,個別的算法是不須要輸入的,例外print:Hellow Word這句話。因此算法的輸入無關緊要。(4)可行性:寫出的算法必定是要能夠執行的。(5)肯定性:寫出的算法,必定能要明確的告訴計算機應該執行的操做。這就是算法的5個基本特性。

Fifth,算法設計的要求:

算法設計有幾點要求:(1)正確性:咱們設計出來的算法必定要是正確的。(2)可讀性:咱們設計出來的算法必定要讓人能夠看懂。(3)健壯性:咱們設計出來的算法,生命力必定要旺盛,不能跑幾個for循環就掛掉了。(4)時間效率高存儲量低:時間效率,咱們能夠想一想上面提到的兩種算法比較。存儲量,是指對計算機內存來說的,要儘可能少佔用內存空間。

Sixth,算法效率的度量方法:

剛纔咱們談到設計算法要求時,講到了時間效率。算法效率,通常是指算法執行的時間。那麼應該怎樣去度量時間效率呢?書中講了兩種方法:1.過後統計法 2.事前分析估算法。關於過後統計法,是編寫一個計時器,算法跑完,記錄時間。算法的優劣,咱們只能在算法跑完後才能夠知道,顯然這個方法是不科學。事前分析估算法,是經常使用的計算算法效率的方法。

拿咱們剛纔講的兩個算法爲例:

QQ Photo20140522163354 

從圖中,咱們能夠看出這個算法一共執行了1+(n+1)+n+1次。

QQ Photo20140522163658

從圖中,咱們能夠看出這個算法一共執行了1+1+1次。

由於這兩個算法的不一樣之處僅僅在於循環體,與計算上。因此咱們把相同部分去掉,再來看看執行次數。第一個咱們稱爲A,A的執行次數爲n次。第二個咱們稱爲B,B的執行次數爲1次。

其實A與B的差異在n次與1次。兩種算法的優劣,能夠很容易看出了吧?

咱們再來個C算法:

QQ Photo20140522164538

從圖中,咱們能夠看出,這個算法須要執行n的n次方。

咱們來一塊兒來對別一下3個算法的優劣:

若是咱們的輸入規模是10,那麼算法A:須要執行10次  算法B:1次  算法C:10*10 100次。

隨着輸入規模的增大,算法C所花費的時間會愈來愈多。

當咱們在分析估算算法的優劣時,必定要把算法的執行時間與輸入的規模大小聯繫在一塊兒,請看下圖:

QQ Photo20140522165624

 

從圖中,能夠看出隨着規模n的增長,對應的操做數量也會增長。這就比如,一我的的付出,是與獲得成正比的。只要用心付出,踏踏實實的,就會獲得別人得不到的東西。因此,平日的努力,必定要用心,不要作無用功。去努力,就要去用心。心不在焉,不如不幹。

Seventh,函數的漸進增加

咱們來判斷一下兩個算法,哪一個優哪一個劣。A算法,須要作2n+3次操做,B算法須要作3n+1次操做。單從字面上看不出優劣,咱們能夠進行一下分析:

QQ Photo20140522173027

當n<3時,B算法要優於A算法,當n>3時,A算法優於B算法。像這樣的,輸入規模n沒有限制,當n>N時,函數老是大於另外一個函數。這個函數是漸進增加的。

QQ Photo20140522173631

從圖中咱們能夠看出,隨着n的增大,表達式中的常數(+三、+1)影響很小,咱們能夠忽略。如上圖的,A‘ B’。

咱們在看一下算法C:

QQ Photo20140522173855

從圖中咱們能夠看出,隨着n的增長,表達式的結果不受常數的影響。與最高項數相乘的常數並不重要。如圖C‘D’

 

Eighth,算法時間複雜度

QQ Photo20140522174630

QQ Photo20140522174750

咱們用O()來表示算法的時間複雜度,也稱大O記法。

如何來推導大O記法呢?

QQ Photo20140523125954

常數階:

咱們來回顧一下上面提到過的例子,

QQ Photo20140523125643

這個算法的執行次數函數爲f(n)=3,根據大O階推導方法,咱們來計算一下這個算法的時間複雜度

first:用常數1取代全部加法的常數,f(n)=1.

second:只保留最高階項。沒有最高階項

third:若是最高階項不是1,則去除與這個項相乘的常數。

最後得出f(n)=1.這個算法的時間複雜度爲o(1).

若是咱們把上面的算法改成這樣:

QQ Photo20140523130436

再來計算一下算法的時間複雜度,根據公式推導,咱們發現,時間複雜度仍是f(n  )=1.這種與問題大小無關(n的大小 ),執行時間恆定的算法,

我稱之爲具備O(1)的時間複雜度。或者稱爲常數階。

 

線性階:

QQ Photo20140523131037

QQ Photo20140523131104

 

計算這個算法的時間複雜度,其實就是在計算循環體執行的次數。根據推導咱們得出:時間複雜度爲o( n ).

對數階:

QQ Photo20140523131339

分析這個算法,咱們發現。當X個2相乘大於n時所執行的次數,就是時間複雜度。2^x=n x=log2n.時間複雜度爲O(logn )

 

平方階:

QQ Photo20140523131641

看這個算法,最內層的執行次數函數爲f(n )=n.外一次循環體只是執行n次內循環。因此這個算法的時間複雜度爲o(n*n ).若是外層循環次數改成m,那麼時間複雜度應爲o(n*m )

Ninth,見的時間複雜度

image

上圖就是常見的時間複雜度,最後三個不經常使用。咱們不討論,根據執行時間由小到大的順序依次爲:

O(1 )<O(logn )<O(nlogn )<O(n )<O(n*n )

Tenth,最壞狀況與平均狀況

平均狀況是咱們最理想的狀況,咱們談時間複雜度,通常都是以最壞狀況爲標準。

Eleventh,算法空間複雜度

image

 

說實話,這章本身掌握的很差,好多都是摘錄原文,沒有通過本身的理解。不過,看懂一本書,最少也要看3遍。把這個留在第二遍,好了,這就是第二章的內容。來跟我一塊兒學第三章吧!

相關文章
相關標籤/搜索