数据结构之算法
一、算法定義:
如今普遍認可的對算法的定義是:算法是解決特定問題求解步驟的描述,在計算機中表現為指令的有限序列,并且每條指令表示一個或多個操作。
因此,為了解決某個或某類問題,需要把指令表示成一定的操作序列,操作序列包括一組操作,每個操作都完成特定的功能,這就是算法了。
二、算法的特性:
(1)輸入和輸出
算法具有零個或者多個輸入,并且算法至少有一個或多個輸出。
(2)有窮性
有窮性是指算法在執行有限的步驟之后,自動結束而不會出現無限的循環,并且每一個步驟在可接受的時間完成。
(3)確定性
算法的每一個步驟都具有確定的含義,不會出現二義性。
(4)可行性
可行性是指算法的每一步都必須是可行的,也就是說,每一步都能夠通過執行有限次數完成。
三、算法設計的要求:
(1)正確性
算法的正確性是指算法至少應該具有輸入、輸出和加工處理無歧義性、能正確反映問題的需求、能夠得到問題的正確答案。
但是,“正確”通常在用法上有很大的差別,大體上可以分為四個層次:第一個層次是算法程序沒有語法錯誤,第二個是算法程序對于合法的輸入
數據能夠產生滿足要求的輸出結果。第三個是算法程序對于非法的輸入數據能夠得到滿足規格說明的結果。第四個算法程序對于精心選擇,甚至
是刁難的測試數據都有滿足要求的輸出結果。通常第4層是最困難的,代價昂貴,因此我們把第三層作為一個算法是否正確的標準。
(2)可讀性
算法設計的另一目的是為了便于閱讀、理解和交流。
(3)健壯性
健壯性是指當輸入數據不合法時,算法也能做出相關處理,而不是產生異常或莫名其妙的結果。因此,一個好的算法還能應該對輸入數據不合法
的情況做合適的處理。
(4)時間效率高和存儲量低
時間效率是指算法的執行時間,存儲量需求是指算法在執行過程中需要的最大存儲空間。算法設計應該盡量滿足時間效率高和存儲量低的需求。
四、算法效率的度量方法
(1)事后統計方法
這種方法主要是通過設計好的測試程序和數據,利用計算機計時器對不同算法編程的程序的運行時間進行比較,從而確定算法效率的高低。
(2)事前分析估算方法:
該方法是指在計算機程序編制前,依據統計方法對算法進行估算。
五、函數的漸進增長
假設算法的輸入規模都是n,我們觀察以下幾個算法:
會發現隨著n的增加,算法A比算法B越來越好。此時,我們給出這樣的定義:
函數的漸進增長:給定兩個函數f(n)和g(n),如果存在一個整數N,是的對于所有的n>N,f(n)總是比g(n)大,那么,我們說f(n)的增長漸快于g(n)。
另外,通過下面的兩外一個表格我們可以發現:
當n>3后,算法C的優勢越來越大于算法D,后面的常數對于結果沒有什么影響。在觀察發現,算法C‘的次數隨著n的增長,還世遠遠小于算法D‘,這說明與
最高次項相乘的常數并不重要。
在觀察下面的第三個例子:
我們可以發現,最高次項的指數大的,函數隨著n的增長,結果也會變得增長的特別的快。
由上面這個三個例子,我們可以得出這樣一個結論:判斷一個算法的效率時,函數中的常數和其它次要項常常可以忽略,而更應該關注主項(最高階項)的階數。
五、算法時間復雜度
(1)算法時間復雜度定義:
在進行算法分析時,語句總的執行次數T(n)是關于問題規模n的函數,進而分析T(n)隨著n的變化情況并確定T(n)的數量級。算法時間復雜度,也就是算法的時間
度量,記作:T(n)=O(f(n)),他表示隨著問題規模n的增長,算法執行時間的增長率和f(n)的增長率相同,稱作算法的漸進時間復雜度,簡稱為時間復雜度,
其中f(n)是問題規模n的某個函數。
這樣用大寫O()來體現算法時間復雜度的激發,我們稱之為大O記法。
(2)推導大O階方法
1.用常數1取代運行時間中的所有加法常數。
2.在修改后的運行次數函數中,只保留最高階項。
3.如果最高階項存在且不是1,則去除與這個項相乘的常數。得到的結果就是大O階。
(3)常見的時間復雜度
常見的時間復雜度所消耗的時間從小到大一次是:
六、算法的空間復雜度
算法的空間復雜度通過計算所需的存儲空間實現,算法的空間復雜度的計算公式記作:S(n)=O(f(n)),其中,n為問題的規模,f(n)為語句關于n所占
存儲空間的函數。通常,我們都使用“時間復雜度”來指運行時間的需求使用“空間復雜度”值空間需求。當不用限定詞的使用“復雜度”時,通常都是指時間復雜度。
?
轉載于:https://www.cnblogs.com/junjiang3/p/7787906.html
總結
- 上一篇: 求一个真心喂了狗的个性签名
- 下一篇: 初始程序设计步骤