Java算法手冊讀書筆記 01.什麼是算法?

00.算法的發展歷史 

算法的起源可以追溯到我國的古代公元前1世紀的《周髀算經》,它是算經的十書之一,算法在我國古代被稱爲“演算法” 。

在西方公元9世紀波斯數學家al-khwarizmi提出了算法的概念,算法最初寫爲algorism,意思採用阿拉伯數字的運算法則,到了18世紀,算法正式命名爲algorithm。由於漢字計算的不方便,所以我國古代算法的發展比較緩慢,而採用阿拉伯數字的西方國家則發展迅速。

歷史上Ada Byron被認爲是第一個程序員。她在1842年編寫的巴貝奇分析機上的伯努利方程求解算法程序雖然未能執行,但奠定了計算機算法程序設計的基礎。

01.數據結構+算法=程序 

     Pascal之父尼克勞思·沃斯(Nicklaus Wirth)憑藉他提出的著名公式“算法+數據結構=程序”獲得圖靈獎。這個公式對計算機科學的影響程度足以類似物理學中愛因斯坦的E=MC^2 , 從中可以看到算法和數據結構之間的關係。

     算法在教科書中的專業解釋:算法是解決實際問題的一種一種精確描述方法,算法是對特定問題的求解步驟的一種精確描述方法。目前被廣泛認可的算法專業定義是,算法是模型分析的一組可行的,確定的和有窮的規則

     通俗的說算法相當於邏輯,小部分已爲人們發掘出來(這裏的小部分指的是書本里講的各種算法,屬於人們對於特定模式抽象出來的核心,比如排序),可以看做一種模式。對應於業務來說,一種邏輯(可能由其他元子邏輯組合而成)一旦確定下來,便可看做常量,固定不變。其次,算法可以理解爲一個完整的解題步驟,由一些基本的運算和規定的運算順序構成,通過這樣的解題步驟可以解決特定的一些問題,從計算機的程序設計角度去看算法由一系列求解問題指令構成,能夠根據規範的輸入,在有限的時間內獲得有效的輸出結果,算法代表了用系統的方法來描述解決問題的一種策略機制。

     數據結構即數據的組織形式,可以用來表示特定的數據,在計算機程序設計中,操作的對象是各式各樣的數據,這些數據往往由不同的數據結構,如數組,結構體,聯合,指針,鏈表等,因爲不同的數據所採用的數據處理方法不同,計算的複雜程度也不同,因此算法往往依賴某一種數據結構,即數據結構是算法實現的基礎

02.算法的基本特徵

舉一個例子,假如有你回到了家,家裏沒有熱水,也沒有女朋友,整理了一下思路你準備做以下幾件事

事件A洗菜  5分鐘
事件B燒水 10分鐘
事件C泡麪  5分鐘
事件D掃地  5分鐘

以上幾件事,不同的順序將導致不同的完成時間

如事件按ABCD的順序做完那麼需要25分鐘

如事件按BADC的順序做完那麼只需要15分鐘

由上面的例子來看,雖然兩種順序都達到了做完事情的目的,但是一種方式比第二鐘慢了10分鐘(爲了喫完能多改幾個bug我想大多數程序員都會選第二種....)。從這裏看出,算法也是由好壞區別的,好的算法可以提高工作效率,獲得更好的結果。

一個典型的算法一般可以從中抽取出如下5個特徵

1.有窮性  

算法的指令或者步驟的執行次數是有限的,執行的時間也是有限的。

2.確切性

算法的每行一個指令或者步驟都必須由明確的定義和描述。

3.輸入

一個算法應該由相應的輸入條件,用來刻畫運算對象的初始情況。

4.輸出

一個算法應該由明確的輸出結果,沒有結果的算法毫無意義。

5.可行性

算法的執行步驟必須是可行的,且可以在有限的時間內完成,無法執行的步驟是毫無意義的,解決不了任何實際問題。

03.算法的分類

1.按照應用來分類

按照算法的應用領域,即解決的問題,算法可以分爲基本算法,數據結構相關算法,幾何算法,圖論算法,規劃算法,數值分析算法,加密/解密算法,排序算法,查找算法,並行算法,和數論算法等

2.按照確定性分類

a.確定性算法

確定性算法能在有限的時間內完成計算,得到的結果是唯一的,且經常取決於輸入值。

b.非確定性算法

非確定性算法能夠在有限的時間內完成計算,但是得到的結果往往是不是唯一的,存在多值性。

3.按照算法的思路分類

算法可以分爲遞推算法,遞歸算法,窮舉算法,貪婪算法,分治算法,動態規劃算法,和迭代算法等多種算法。

04.算法相關的概念區別

算法是一個抽象的概念,往往需要依託於具體的實現方式才能體現它的價值,如在計算機編程中的算法,數值計算中的算法等, 

1.算法與公式的關係

公式是用於解決某類問題,有着特定的輸入和輸出結果,能夠在有限的時間內完成,並且公式都是可以操作計算的,但算法並不一定是公式,公式只是提供了一種算法。

2.算法與程序的關係

傳統的筆算中,通過紙和筆按照一定的步驟完成的計算也是算法的應用,在速記中,人們通過特殊的算法來達到快速牢固記憶的目的,這也是一種算法的應用,同樣,程序設計語言是算法實現的一種形式,也是一種工具,通過熟悉程序設計語言的語法格式,然後使用程序設計語言編寫出實現算法的程序。

3.算法與數據結構的關係

算法是解決問題的一個抽象方法和步驟,同一個算法在不同的語言中具有不同的實現形式,其依賴於數據結構的形式和程序設計語言的語法格式,數據結構往往表示的是處理的對象,算法是計算和處理的核心方法,程序設計語言是是算法的設計方式,其綜合構成結果即爲程序。可以用公式    數據結構+算法+程序設計語言=程序  來理解。

05.算法的表示

算法是爲了解決實際問題的,一般來說隨着問題的難度增加,算法也會相應的複雜,爲了便於交流和進行算法處理往往需要將算法進行描述,即算法的表示,一般來說,算法可以採用自然語言的表示,流程圖表示,N-S圖表示,僞代碼表示,

a.自然語言表示

自然語言通俗的講就是口頭描述的語言,對於一些簡單的算法可以採用,然而很多算法都比較複雜,很難用自然語言來進行描述,不利於發展與交流,所以需要採用其他的方法來進行表示。

b.流程圖表示

流程圖是一種圖形表示算法流程方法,其由一些圖框和流程線組成,圖框表示各種操作的類型,圖框中的說明文字和符合表示該操作的內容,流程線表示操作執行的順序。

流程圖的優點是簡單直觀便於理解,在計算機領域中有着廣泛的應用。

 

計算兩個輸入數據x和y的最大值的流程圖表示

實際使用中,一般採用如下三種流程結構。

1.順序結構

順序結構是最簡單的一種結構,簡單地一個接着一個地進行處理,順序結構適合於簡單的算法。

2.分支結構

分支結構常用用於根據某個條件,來決定算法的走向,

3.循環結構

循環結構常用於需要反覆執行的算法操作,按照循環的方式,可以分爲當型循環結構和直到型循環結構。

當型循環結構先對條件進行判斷,然後在執行,一般採用while語句實現

直到型循環先執行,然後在對條件進行判斷,一般採用do...while語句實現

 

c.N-S圖表示

N-S圖也稱爲盒圖或者CHAPIN圖,1973年由美國學者I.Nassi和B.SHneiderman提出,他們發現採用流程圖可以清楚表示算法或者程序的運行過程,但其中的流程線並不是必須的,因此創立了N-S圖,在N-S圖中,將整個程序寫在一個大框內,這個大框圖由若干個小的基本框圖組成,採用N-S圖可以方便的表示流程圖的內容。

 

d.僞代碼表示

僞代碼(Pseudocode)是另外一種算法的描述方式,僞代碼並非真正的程序代碼,其介於自然語言和編程語言之間,因此,僞代碼並不能夠直接在計算機中運行,使用僞代碼的目的是將算法描述成一種類似編程語言的形式,這樣便可以很容易的理解算法的結構,再根據編程語言的語法特點,稍加修改,即可實現一個真正的算法程序。

 僞代碼只是像流程圖一樣用在程序設計的初期,幫助寫出程序流程。簡單的程序一般都不用寫流程、寫思路,但是複雜的代碼,最好還是把流程寫下來,總體上去考慮整個功能如何實現。寫完以後不僅可以用來作爲以後測試,維護的基礎,還可用來與他人交流。但是,如果把全部的東西寫下來必定可能會讓費很多時間,那麼這個時候可以採用僞代碼方式。比如:

  IF 九點以前 THEN

        do 私人事務;

  ELSE 9點到18點 THEN

  工作;

  ELSE

  下班;

  END IF

  這樣不但可以達到文檔的效果,同時可以節約時間. 更重要的是,使結構比較清晰,表達方式更加直觀。使用僞代碼是,描述應該結構清晰,代碼簡單,可讀性好,這樣才能夠有利於算法表示。

06.算法的性能評價

算法其實就是解決爲的一種方法,一個問題的解決往往可能有很多種方法,但每種方法所用時間個得到的效果往往是不一樣的。好的算法執行效率高,所耗費時間短,差的則相反。算法的一個重要任務就是找到合適的效率最高的解決問題的辦法,即最好的算法,理論上來講這就需要對算法有一個合理客觀的評價,一個算法的優劣往往是通過算法的複雜度來測量的,算法複雜度包括時間複雜度和空間複雜度。

1.時間複雜度

時間複雜度即算法執行所有消耗的時間,時間越短,算法越好

算法代碼執行的時間往往和算法的執行時間複雜度還於問題的規模,算法代碼中語句執行的數量有關,由於每一條代碼的執行都需要時間,語句執行的越多,整個程序執行的時間就越長,因此,簡短精悍的算法程序往往執行速度快,

2.空間複雜度

空間複雜度指的是算法程序在計算機中執行所消耗的存儲空間。

a.程序保存所需要的存儲空間,即程序的大小

b.程序在執行過程中所需要消耗的存儲空間資源,如程序在執行過程中的中間變量。

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章