寫乙個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)常數階 o(1)在修改後的執行次數函式中,只保留最高項。
如果最高項存在且不是1,則去除與這個項相乘的常數
不管常數階中常數是多少,我們都記作o(1),而不能是o(3)、o(12)。因為他執行的次數是恆定的,不會隨著n的變大而發生變化。
2)線性階 o(n)
分析演算法的複雜度,關鍵就是要分析迴圈結構的運**況。
例如乙個for迴圈,因為其迴圈體中的**需要執行n次,故他的迴圈的時間複雜度為o(n)
3)對數階 o(logn)for
(int i =
0; i)
例如下面這段**
由於每次count乘以2之後,就距離n更近了一步。也就是說有多少個2相乘後大於n就會退出迴圈。int count =1;
while
(count
由2x=n,得到x= log 2 n,所以時間複雜度為o(log 2 n)
4)平方階
例如乙個迴圈巢狀
它的時間複雜度為o(n2)for
(int i=
0; i)}
演算法的空間複雜度通過計算演算法所需的儲存空間實現,
演算法空間複雜度的計算公式記作: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 當線性表的長度變化較大時,難以確定儲...