資料結構之演算法

2022-08-03 18:36:15 字數 2613 閱讀 7823

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

演算法是需要單獨講解的,在資料結構中談到演算法,是為了幫助理解好資料結構,並不會詳談演算法的方方面面。

1+2+3+.....+100

演算法1:

#include int main(void) 

printf("%d", sum);

return 0;

}

演算法2(高斯的演算法):

#include int main(void)

顯然高斯的演算法厲害很多。

五個基本特性:輸入、輸出、有窮性、確定性和可行性

1、輸入輸出

演算法具有林哥或多個輸入,但至少有乙個或多個輸出,輸出的形式可以是列印、返回乙個或多個值。

2、有窮性

演算法在指定郵箱的步驟之後,自動結束而不會出現無限迴圈,且每個步驟在可接受的時間內完成。

3、確定性

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

4、可行性

演算法的每一步都必須是可行的。

好的演算法應該具有:正確性、可讀性、健壯性、高效率和低儲存量的特徵。

1、正確性

至少應該具有輸入、輸出和加工處理無歧義性、能正確反映問題的要求,能得到問題的正確答案。

但通常對「正確」的理解有很大差別,大致分為以下四個層次:

(1)沒有語法錯誤;

(2)合法的輸入資料能產生滿足要求的輸出結果

(3)非法的輸入資料能滿足規格說明的結果;

(4)精心選擇的,甚至刁難的測試資料都有滿足要求的輸出結果

證明乙個複雜算在所有層次是正確的,代價非常昂貴,所以一般,我們把層次3作為乙個演算法是否正確的標準。

2、可讀性

便於閱讀、理解和交流。可讀性是演算法好壞很重要的標誌。

3、健壯性

輸入資料不合法是,演算法也能做出相關處理,而不是產生異常或莫名其妙的問題。

4、時間效率高和儲存量低

判斷乙個演算法的效率時,函式中的引數和其他次要項常常可以忽略,而更應該關注主項(最高端項)的階數。

某個演算法,隨著n的增長,它會越來越優於另一演算法,或越來越差於另一演算法。

1、定義

t(n)=o(f(n)) ,表示隨問題規模n的增大,演算法執行時間的增長率和f(n)的增長率相同,稱為演算法的漸進時間複雜度,簡稱時間複雜度。其中f(n)是問題規模n的某個函式。

用o( )體現演算法時間複雜度的記法,稱為 大o記法。

2、推導大o階方法

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

(2)在修改後的執行次數函式中,只保留最高端項。

(3)如果最高端項存在且不是1,這去除與這個項相乘的常數。

得到的結果就是大o階。

3、常數階

下面這個演算法不是o(3),而是o(1)  

int i, sum = 0, n = 100; /*執行一次*/

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

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

執行時間恆定的演算法,稱之為具有o(1)的時間複雜度,又叫常數階

不管常數是多少,我們都記作o(1),而不能是o(3)等其他任何數字,這是初學者常犯的錯誤。

對於分支結構(不包含在迴圈結構中),無論真假,執行次數都是恆定的,所以其時間複雜度也是o(1).

4、線性階

分析演算法的複雜度,關鍵是要分析出迴圈結構的運**況。

下面這段**是o(n),因為迴圈體要執行n次 

int i, sum = 0, n = 100;

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

5、對數階

下面這段**,x = ㏒₂n,所以時間複雜度為o(㏒n)

int count = 1, n = 100;

while (count < n)

6、平方階

下面這段**,迴圈體的巢狀,時間複雜度為o(n²)

for(int i = 0;i 時間複雜度耗費時間從小到大排序依次是

執行次數函式

階非正式術語

12o(1)

常數階5㏒₂n+20

o(㏒n)

對數階2n+1

o(n)

線性階2n+3n㏒₂n+19

o(n㏒n)

n㏒n階

3n²+2n+1

o(n²)

平方階6n³+2n²+3n+4

o(n³)

立方階2ⁿ

o(2ⁿ)

指數階當然還有o(n!)和o(nⁿ),但o(n³)、o(2ⁿ)、o(n!)和o(nⁿ)除非很小的n值,否則哪怕n只是100,都是噩夢般的執行時間,對於這種不切實際的演算法時間複雜度,一般都不討論它。

最壞情況執行時間是一種保證,那就是執行時間將不會再壞了。在應用中,這是一種最重要的需求,通常,我們提到的執行時間都是最壞情況的執行時間。

而平均執行時間是所有情況中最有意義的,因為它是期望的執行時間。

寫**時,完全可以用空間換取時間。

演算法的空間複雜度通過計算演算法所需的儲存空間實現,演算法空間複雜度的計算公式記作:s(n)=o(f(n))。

我們討論的一般都是演算法的時間複雜度。

資料結構之演算法

資料結構 演算法 程式 資料結構是對資料 操作物件 的描述,及資料的型別和組織形式,演算法則是對操作步驟的描述 1.有窮性 演算法中的每個步驟都能在有限時間內完成 程式可不滿足此條件 2.確定性 演算法的每一步必須確切定義,在任何條件下演算法只有一條執行路徑 3.可行性 演算法中的所有操作必需通過已...

《資料結構與演算法》之資料結構簡介

資料結構 資料 結構,資料結構是計算機儲存 組織資料的方式。資料結構是指相互之間存在一種或多種特定關係的資料元素的集合。通常情況下,精心選擇的資料結構可以帶來更高的執行或者儲存效率。資料結構往往同高效的檢索演算法和索引技術有關。一 資料的邏輯結構 指反映資料元素之間的邏輯關係的資料結構,其中的邏輯關...

資料結構48 資料結構之查詢演算法

在日常生活中,幾乎每天都要進行一些查詢的工作,在 簿中查閱某個人的 號碼 在電腦的資料夾中查詢某個具體的檔案等等。本節主要介紹用於查詢操作的資料結構 查詢表。查詢表是由同一型別的資料元素構成的集合。例如 號碼簿和字典都可以看作是一張查詢表。一般對於查詢表有以下幾種操作 在查詢表中只做查詢操作,而不改...