第二章 算法
算法具有五個基本特性:
輸入、輸出、有窮性、確定性和可行性
1)輸出,可以有另個或多個
2)輸出,一定要有,一個或多個
3)有窮性:算法在執行有限的步驟后,自動結束而不會出現無限循環,而且每一個步驟在可接受的時間內完成。
4)確定性:算法的每一個步驟都具有確定的含義,不會出現二義性。
5)可行性:每一步都必須是可行的。
算法設計的要求:(好算法)
1)正確性:算法至少應該具有輸入、輸出和加工處理無歧義性、能正確放映問題的需求、能夠得到問題的正確答案。
2)可讀性:便於閱讀、理解和交流。
3)健壯性:當輸入數據不合法時,算法也能做出相關處理,而不是產生異常或莫名其妙的結果。
4)時間效率高和存儲量低:即算法執行的時間和算法執行的過程中需要的最大存儲空間(算法程序運行時所占用的內存或外部硬盤存儲空間。 )
算法效率的度量方法:
1)事后統計方法:通過設計好的測試程序和數據,利用 計算機計數器對不同算法編制的程序的運行時間進行比較,從而確定算法效率的高低。(缺陷多,不予考慮)
2)事前分析估算方法:在計算機程序編制之前,依據統計方法對算法進行估算。
一個高級程序設計語言編寫的程序在計算機上運行所消耗的時間取決於下列因素:
1、算法采用的策略、方法(根本)@@@
2、編譯產生的代碼質量(軟件)
3、問題的輸入規模(即輸入量的多少)@@@
4、機器執行指令的速度(硬件性能)
函數的漸進增長:
判斷一個算法的效率時,函數中的常數和其他次要項常常可以忽略,而更應該關注主項(最高階項)的階數。
通過算法實踐復雜度來估計算法時間效率。
算法時間復雜度:
T(n)=O(f(n))表示隨問題規模n的增大,算法執行時間的增長率和f(n)的增長率相同,稱作算法的漸進時間復雜度,簡稱時間復雜度。其中f(n)是問題規模n的某個函數。(大O記法)
一般情況下,隨着n的增大,T(n)增長最慢的算法為最優算法。
O(1)叫常數階、O(n)叫線性階、O(n2)叫平方階。
推導大O階方法(如何分析算法的時間復雜度)
1、用常數1取代運行時間中的所有加法常數。
2、在修改后的運行次數函數中,只保留最高階項。
3、如果最高階項存在且不是1,則去除與這個項相乘的常數。
得到的結果就是大O階。
常見的時間復雜度
常用的時間復雜度所耗費的時間從小到大依次是:
O(1)<O(logn)<O(n)<O(nlogn)<O(n^2)<O(n^3)<O(2^n)<O(n!)<O(n^n)
算法空間復雜度
S(n)=O(f(n)) n為問題的規模,f(n)為語句關於n所占存儲空間的函數
摘錄自:《大話數據結構》程傑