算法及復雜性分析


計算機應用:

數值計算:加工處理的對象--純粹的數值。

非數值計算:工業檢測、過程控制、管理系統、數據處理--->加工處理的對象(具有一定的結構)

具有一定的結構包括:

邏輯結構:研究對象的特性及其相互之間的關系

存儲結構:有效地組織計算機存貯

算法:有效地實現對象之間的“運算”關系

以上是《數據結構與算法》的研究內容

 

算法:通俗地講,算法就是解題的方法。算法是對特定問題求解步驟的一種描述,它是指令的有限序列,其中每一條指令表示一個或多個操作。

算法的五個特性:

有窮性:一個算法必須總是在執行有窮步之后結束,且每一步都在有窮時間內完成。

確定性:算法中的每一條指令必須有確切的含義,無二義性。並且在任何條件下,對於相同的輸入只能得出相同的輸出。

有效性:算法描述的所有操作都可以通過已經實現的基本運算執行有限次來實現的。

輸入:一個算法有零個或多個輸入,這些輸入取自於某個特定的對象集合。他們可以使用輸入語句由外部提供,也可以使用賦值語句在算法內給定。

輸入:一個算法有一個或多個輸出,這些輸出是同輸入有着某些特定關系的量。

 

算法設計的要求

設計一個“好”的算法應開率以下幾個方面(評價標准):

(一)正確性:算法應滿足具體問題的需求。

“正確”的含義有很大的差別,大體可分為以下四個層次:

1、不含語法錯誤

2、對於幾組輸入數據能夠得出滿足規格說明要求的結果

3、對於精心選擇的、典型的、苛刻的、帶有刁難性的幾組數據能夠得出滿足規則說明要求的結果

  通常以第3層意義的正確性作為衡量算法是否合格的標准。

4、對於一切合法的輸入數據都能產生滿足規格說明要求的結果

 

(二)可讀性:算法在正確的前提下可讀性是擺在第一位的,這在當今大型軟件需要多人合作的環境下是至關重要的,另一方面,晦澀難讀的程序易於隱藏錯誤而難以調試。

(三)健壯性:算法應具有容錯處理功能。

當輸入的數據非法時,算法應當恰當地作出反映或進行相應處理,而不是產生莫名其妙的輸出結果。並且,處理出錯的方法不應是中斷程序的執行,而應是返回一個表示錯誤或錯誤性質的值,以便在更高的抽象層次上進行處理。

(四)高效率:效率指的是算法執行的時間(時間復雜性);高效性則要求算法的執行時間要盡可能的短,其執行時間越短,算法的效率就越高;

(五)低存儲量需求:存儲量需求指算法執行過程中所需要的最大存儲攻堅(空間復雜性)。一般這兩者與問題的規模有關。

 

一個好的算法首先要具備正確性、可讀性和健壯性。

再考慮:時間效率,空間效率

 

算法效率的度量

(1)事后統計的方法

此方法有兩個缺陷:一是必須先運行程序;二是所得時間的統計量依賴於計算機的硬件、軟件等環境因素。

(2)事前分析估算的方法

與算法執行時間相關的因素有:

1算法選用的策略  2問題的規模

3編寫程序的語言  4編譯程序產生的機器代碼的質量

5計算機執行指令的速度

 

分析:任何一個算法都是由一個控制結構和若干原操作組成的。

控制結構:順序、分支和循環3種。

 

算法的執行時間Σ = 原操作(i)的執行次數*原操作(i)的執行時間

算法的執行時間 與 原操作執行次數之和 成正比

通常做法:從算法中選取對所研究問題(或算法類型)來說是基本操作的原操作,以該基本操作重復執行次數作為算法的時間度量。

 

例:兩個N*N矩陣相乘算法。

for (i=1;i<=n;++i)

{

for(j=1;j<=n;++j)

{

c[i][j] = 0;

for (k=1;k<=n;++k)

  c[i][j] += a[i][k] *b[k][j]

}

}

基本操作:

c[i][j] += a[i][k] *b[k][j]

算法執行時間:

T(n) = O(n³)

 

一個算法的執行基本運算次數T(n)是問題規模n的某個函數f(n),記作:

T(n)=O(f(n))

記號“O”讀作“大O”(是Order的簡寫,意指數量級),它表示隨問題規模n的增大,算法執行時間的增長率和f(n)的增長率相同。

算法的時間復雜度以算法中基本操作執行的次數(簡稱頻度)作為算法的時間度量。

 

推導大O階攻略:

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

2、當T(n)為多項式時,可只讀取其最高次冪項,且它的系數也可略去不寫。

3、得到的最后結果就是大O階。

 

常量階O(1)

int fun2(int n)

{int s;

s = (n*(n+1)/2);

return s;

}

線性階O(n)

int fun2(int n)                          

{int  i,s=0;

for (i=1;i<=n;i++)

  s+=i;

return s;

}

int fun2(int n)                          

{int  i,s=0;

for (i=1;i<=n;i+=2)

  s+=i;

return s;

}

 

平方階O(n²)

int i,j;

int sum =0

for (i=1;i<n;++i)

{

for(j=1;j<n;++j)

{

sum+=i*j

}

}s

 

對數階O(logn)

int count=1;

while(count <n)

{

count = count*2

}

 

時間復雜度T(n)按數量級遞增順序為:

常數階 對數階 線性階 線性對數階 平方階 立方階 ...

k次方階

指數皆 階乘階
O(1) O(log₂n) O(n) O(nlog₂n) O(n²) O(n3)    O(n k) O(2ⁿ) O(n!)

復雜度低      →復雜度高

注:

O()為漸進符號。

空間復雜度S(n)按數量級按遞增順序也與上表類似。

其中,O(1)為常數數量級,即算法的時間復雜性與輸入規模n無關。

 

算法的存儲空間需求

空間復雜度:算法所需存儲空間的度量,記作:S(n) = O(f(n))

其中n為問題的規模。

一個算法所需存儲空間:算法本身的空間、輸入數據的存儲空間、算法在運行過程中臨時占用的存儲空間。

若所需臨時空間不隨問題規模的大小而改變,則稱此算法為原地工作。

若所需存儲量依賴於特定的輸入,則通常按最壞情況考慮。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM