什么是算法?
算法(Algorithm)是解決特定問題求解步驟的描述,在計算機中表現為指令的有限序列,并且每條指令表示一個或多個操作。
給定一個問題,能夠解決這個問題的算法是有很多種的。算式中的問題是千奇百怪的,所以算法也是千變萬化的。
算法的定義中提到了指令,指令能夠被人或機器等計算裝置執行,可以是計算機指令也可以是我們平時的語言文字。?
為了解決某個或某類問題,需要把指令表示成一定的操作序列,
數據結構與算法的關系
數據結構和算法的關系就像森林冰火人、羅密歐與朱麗葉,我們很少會只談其中一個,而總是作為整體去看待。
如果只談數據結構,可能沒什么感覺不知道數據結構有什么用處,但如果再了解完算法的知識,就會得到領悟。
比較兩種算法
現在我們回到一個簡單的問題:寫一個求1+2+3+……+100結果的程序。
我們會馬上想到循環語句的使用:
這就是一種算法,但這樣寫并不是最高效的。
我們知道高斯也算過這個問題,而且使用的是很高效的方法:
sum = 1 + 2 + 3 +... + 99 + 100sum = 100 + 99 + 98 +... + 2 + 1
2*sum = 101 + 101+101 +... +101 + 101
用程序實現高斯的這個方法就是:
算法的特性
算法具有五個基本特性:輸入、輸出、有窮性、確定性和可行性。
輸入輸出
這是比較好理解的特性,算法具有零個或多個輸入,至少有一個或多個輸出(算法是一定有輸出的),輸出的形式可以是打印輸出,也可以是返回一個或多個值等。
有窮性
指的是算法在執行有限的步驟之后,自動結束而不會陷入無限循環,且每一個步驟在可接受的時間內完成。
確定性
指的是算法的每一步驟都具有確定的含義,不會出現二義性。算法在一定條件下,只有一條執行路徑,相同的輸入只會有唯一的輸出結果。算法的每個步驟被精確定義而無歧義。
可行性
指的是算法的每一步都必須是可行的,也就是說,每一步都能夠通過執行有限次數完成。
可行性意味著算法可以轉換為程序上機運行,并得到正確的結果。
算法設計的要求
我們知道算法不是唯一的,因為解決問題的方法不會只有一種。盡管算法不唯一,相對好的算法還是存在的,解決一個問題的方法有優劣之分。那么怎樣才算是好的算法呢?
正確性
指的是算法至少應該具有輸入、輸出和加工處理無歧義性,能正確反映問題的需求,能夠得到問題的正確答案。
但是算法的“正確”通常在用法上有很大的差別,大體分為以下四個層次:
1.算法程序沒有語法錯誤。
2.算法程序對于合法的輸入數據能夠產生滿足要求的輸出結果。
3.算法程序對于非法的輸入數據能夠得出滿足規格說明的結果。
4.算法程序對于精心選擇的,甚至刁難的測試數據都有滿足要求的輸出結果。
這四層是一個循序漸進的關系,層次1的要求是最低的,僅僅沒有語法錯誤,談不上是好算法。層次4是最困難的,我們很難逐一驗證所有的輸入都得到正確的結果。
所以層次3一般作為算法是否正確的標準。
可讀性
算法設計的另一目的是為了便于閱讀、理解和交流。
可讀性高可以幫助人們理解算法,晦澀難懂的算法則往往隱含錯誤,不易被發現,且難于調試和修改。
寫代碼的目標一方面是為了讓計算機執行,另一個重要的目標是便于他人閱讀,讓人理解和交流,自己將來也能閱讀。如果可讀性不好,日后自己看的時候都會難以理解。可讀性是算法(代碼)好壞的一個很重要的標準。
健壯性
一個好的算法還應該能對輸入數據不合法的情況做適當的處理。比如輸入的時間或者距離不應該是負數等。而健壯性就體現在輸入數據不合法時算法也能做出相關處理,而不是產生異常或莫名其妙的結果。
時間效率高和存儲量低
當然,好的算法應該時間效率高、存儲量低。
時間效率指的是算法的執行時間。對于同一個問題,如果有多個算法能解決,執行時間短的算法效率高,執行時間長的效率低。存儲量需求指的是算法在執行過程中需要的最大存儲空間,主要指算法程序運行時所占有的內存或外部硬盤存儲空間。
設計算法應該盡量滿足時間效率高和存儲量低的需求。通俗來說就像是花最少的錢,用最短的時間,辦最大的事。具體來說就是用最少的存儲空間,花最少的時間,解決同樣的問題,這就是好的算法。
綜上,好的算法應該滿足正確性、可讀性、健壯性、高效率和低存儲量這些點。
本文到此結束,祝閱讀愉快^_^