1. 程式人生 > >大話資料結構-演算法(2)

大話資料結構-演算法(2)

啟示:

演算法是解決特定問題求解步驟的描述,在計算機中表現為指令的有限序列,並且每條指令表示一個或多個操作

演算法定義:

演算法是解決特定問題求解步驟的描述,在計算機中表現為指令的有限序列,並且每條指令表示一個或多個操作

演算法的5個特性:輸入,輸出,又窮性,確定性和可行性

    輸入和輸出:演算法具有零個或多個輸入,至少有一個或多個輸出。

    有窮性:指演算法在執行有限的步驟之後,自動結束而不會出現無限迴圈,並且每一個步驟在可以接受的時間內完成(可理解為:有邊界線)

     確定性:演算法的每一步驟都具有確定的含義,不會出現二義性。

      可行性:演算法的每一步都必須是可行的,也就是說,每一步都能通過執行有限次數完成。

演算法設計的要求:

正確性:演算法的正確性是指演算法至少應該具有輸入,輸出和加工處理無歧義性,能正確反映問題的需求,能夠得到問題的正確答案

其中“正確”分為四個層次:

算髮程式沒有語法錯誤

演算法程式對於合法的輸入資料能夠產生滿足要求的輸出結果

演算法程式對於非法的輸入資料能夠得出滿意規格說明的結果

演算法程式對於精心選擇的,甚至刁難的測試資料都有滿足要求的輸出結果。

可讀性

可讀性:演算法設計的另一個目的是為了便於閱讀,理解和交流

健壯性:當輸入資料不合法時候,演算法也能做出相關處理,而不是產生異常或者莫名其妙的結果。

時間效率高和儲存率低

演算法效率的度量方法

事後統計方法:這種方法主要是通過設計好的測試程式和資料,利用計算機計時器對不同演算法按編制的程式的執行時間進行比較,從而確定演算法效率的高低

事前分析估算方法:在計算機程式變之前,一句統計方法對演算法進行估算。

演算法時間複雜度:

演算法時間複雜度定義: 在進行演算法分析時,語句總的執行次數T(n)是關於問題規模N的函式,進行分析T(n)的變化情況並確定T(n)的數量級,演算法的時間複雜度,也就是演算法的時間量度,記住:T(n)=o(fn),它表示歲問題規模N的增大,演算法執行時間的增長率相同,稱作演算法的漸進時間複雜度,簡稱為時間複雜度,其中f(n)是問題規模n的某個函式。

這樣用大寫O【】來體現演算法時間複雜度的記發,我們稱之為大O的記發,一般情況下,隨著n的增大,T(n)增長最慢的演算法為最優演算法

推匯出大O階的方法

1、用常數1取代執行時間中的所有加法常數

2、在修改後的執行次數函式中,只保留最高階項 

3、如果最高階項存在且不是1,則去除與這個項相乘的常數得到的結果就是大O階。

舉例:高斯演算法:

int sum=,n=100; 執行一次

sum=(1+n)*n/2; 執行一次

printf("%d",sum); 執行一次

常數階:

這個演算法的執行次數函式f(n)=3,根據大O階的第一條,將常熟3改為1,在保留最高項時候,沒有,所有 時間複雜度為o【1】,其中n不管為多少,執行時間恆定 ,所以為o【1】的時間複雜度,有叫常數階

線性階:

int i=0;

for(i=0;i<n,i++)

對數階:

int count=1;

while(count<n){

count=count*2} 由於每次count乘於2之後,就距離n更近一步。

平方階: 例如99乘法表,

常見的時間複雜度:


演算法空間複雜度

演算法的空間複雜度用過計算演算法阿所需的儲存空間實現,演算法空間複雜度的計算公式稱作為:s(n)=o(f(n)) 其中n為問題的規模,f(n)為語句關於n所佔儲存空間的函式。