筆記 大話資料結構 第2章 演算法

2021-10-09 06:32:18 字數 1872 閱讀 3835

寫乙個1+2+3+…+100求和程式

int i, sum =

0, n =

100;

/* 執行了1次 */

for(i =

1; i <= n; i++

)/* 執行了n+1次 */

printf

(" %d "

,sum)

;/* 執行了1次 */

這樣可能不高效,高斯同學是這樣想的:

int i, sum =

0, n =

100;

/* 執行了1次 */

sum =(1

+n)* n /2;

/* 執行了1次 */

printf

("%d"

,sum)

;/* 執行了1次 */

如今普遍認可的對演算法的定義是:

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

演算法具有五個基本特性:

輸入輸出有窮性確定性可行性

​ 乙個好的演算法,應該具有正確性可讀性健壯性高效率低儲存量的特性。

(並不是**越少,演算法就越優秀,還應該考慮他的可讀性)

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

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

​ 一般隨著n的增大,t(n)增長最慢的演算法為最優演算法

如何計算時間複雜度(推導大o階)?

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

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

如果最高項存在且不是1,則去除與這個項相乘的常數

1)常數階 o(1)

​ 不管常數階中常數是多少,我們都記作o(1),而不能是o(3)、o(12)。因為他執行的次數是恆定的,不會隨著n的變大而發生變化。

2)線性階 o(n)

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

例如乙個for迴圈,因為其迴圈體中的**需要執行n次,故他的迴圈的時間複雜度為o(n)

for

(int i =

0; i)

3)對數階 o(logn)

​ 例如下面這段**

int count =1;

while

(count

​ 由於每次count乘以2之後,就距離n更近了一步。也就是說有多少個2相乘後大於n就會退出迴圈。

由2x=n,得到x= log 2 n,所以時間複雜度為o(log 2 n)

4)平方階

​ 例如乙個迴圈巢狀

for

(int i=

0; i)}

​ 它的時間複雜度為o(n2)

​ 演算法的空間複雜度通過計算演算法所需的儲存空間實現,

​ 演算法空間複雜度的計算公式記作:s(n)=o(f(n))

​ 其中,n為問題的規模,f(n)為語句關於n所佔儲存空間的函式。

大話資料結構 第2章 演算法

3 演算法設計的要求 4 演算法效率的度量方法 5 函式的逐漸增長 6 演算法時間複雜度 7 常見的時間複雜度 8 最壞情況與平均情況 9 演算法空間複雜度 總結 演算法的定義 演算法是解決特定問題求解步驟的描述,在計算機中表現為指令的有限序列,並且每一條指令表示乙個或者多個操作。演算法的特性 輸入...

大話資料結構 第5章 串

僅作為筆記 串是由零個或多個字元組成的有限序列,又名字串。兩個串比較大小 給定兩個串 s a1 a2 an t b1 b2 bm 當滿足以下條件之一時,sn m,且 ai bi i 1,2,3,n 存在某個k min m,n 使得ai bi i 1,2,k 1 ak bk。串的抽象資料型別 adt ...

大話資料結構閱讀筆記 2

線性表的順序儲存結構,在存 讀資料時,不管是哪個位置,時間複雜度都是o 1 在插入或刪除資料時,時間複雜度是o n 優點 1 無須為表示表中元素之間的邏輯關係而增加額外的儲存空間 2 可以快速地訪問表中任意位置的元素。缺點 1 插入或刪除操作需要移動大量元素 2 當線性表的長度變化較大時,難以確定儲...