一、
演算法(algorithms):是為了求解問題而給出的有限的指令序列,每條指令表示乙個或多個操作。——解決問題的步驟
程式 :是演算法的一種實現,計算機按照程式逐步執行演算法,實現對問題的求解。
1.演算法的性質:
有窮性:乙個演算法必須能在執行有窮步之後結束,且每一步都可在有窮時間內完成;
確定性:演算法中每一條指令必須有確切的含義,不具有二義性。
可行性:演算法中描述的操作都可通過已經實現的基本運算執行有限次來實現。
輸入:乙個演算法有零個或多個輸入,這些輸入取自某個特定的物件的集合;
輸出:乙個演算法有乙個或多個輸出,這些輸出是同輸入具有某種特定關係的量。
2.演算法的描述:常用的描述演算法的方法有 自然語言 流程圖 程式語言 偽**等。
偽**是介於自然語言和程式語言之間的方法,它採用某一程式語言的基本語法,操作指令可以結合自然語言來設計。
二、演算法分析(重點)
事前估計法——時間複雜度估計
事後統計法——程式執行測試
演算法執行所需要的時間,稱為時間複雜性;演算法執行所需要的輔助空間,稱為空間複雜性。
1.事後統計法——程式執行測試
在演算法中的某些部位插裝時間函式time(),測定演算法完成某一功能所花費時間
順序搜尋 (sequenial search)
int seqsearch ( int a[ ], int n, int x )
插裝 time( ) 的計時程式
double start, stop;
time (&start);
int k = seqsearch (a, n, x);
time (&stop);
double runtime = stop - start;
cout << " " << n << " "
cout runtime << endl;
缺點:需先執行依據演算法編制的程式; 軟、硬體環境影響測試結果。
2.事前估計法——時間複雜度估計
●演算法時間複雜度的思維抽象過程如下:演算法的執行時間=每條語句的執行時間之和->每條語句的執行次數之和->基本語句的執行次數->基本與局執行次數的數量級->大o記號表示
①常見的時間複雜度如下:o(㏒₂n)演算法的執行時間(所有語句的語句頻度之和)
t(n)=n+1+n(n+1)+n²=2n+2n²+1
lim t(n)/n²=lim(2n+2n²+1)/2n²=1
n->∞
當問題規模 n→∞時t(n)與某一量同階,稱作演算法的漸近時間複雜度 (asymptotic time complexity,隨著問題規模的增加,演算法執行時間的增長趨勢) :
記作:t(n)=o(n²) o是order的簡寫
●時間複雜度只與演算法中語句頻度最大的語句(基本語句)有關, 而其它語句的時間可以不計,用f(n)代表演算法中語句頻度最大的語句的頻度(基本語句) 則t(n)=o(f(n)): 時間複雜度: t(n)=o(f(n))
(事例看課本p18-19)
○演算法的空間複雜度是指在演算法的執行過程中,需要的輔助空間數量。輔助空間是除演算法本身和輸入輸出資料所佔據的空間外,演算法臨時開闢的儲存空間。通常記作:s ( n ) = o ( f ( n ))。其中, n 為問題規模,分析方法與演算法的時間複雜度類似。
將陣列a中的元素逆置
方法一:
int x;
for (i=0;i//需要輔助乙個空間o(1)
方法二:
int b
for (i=0;ib[i]=a[n-i];
for (i=0;ia[i]=b[i];
演算法的基本概念 演算法分析
一 演算法 algorithms 是為了求解問題而給出的有限的指令序列,每條指令表示乙個或多個操作。解決問題的步驟 程式 是演算法的一種實現,計算機按照程式逐步執行演算法,實現對問題的求解。1.演算法的性質 有窮性 乙個演算法必須能在執行有窮步之後結束,且每一步都可在有窮時間內完成 確定性 演算法中...
演算法分析基本概念
乙個演算法的要求有四個 有輸入 有輸出 有限性 確定性。有乙個很著名的公式是程式 資料結構 演算法。由該式子能看出演算法和程式的關係,演算法是一段有限序列能夠解決乙個問題,是解決問題的方法。程式是乙個實在的東西,能夠解決乙個問題。演算法和程式相比,演算法強調的是方法,所以演算法不拘泥於各種程式語言,...
演算法基本概念
所謂演算法,就是解決問題的一種方法或乙個過程。具體來講,演算法是由若干指令組成的有窮序列。演算法概念並不是計算機學科獨有的概念,生活到到處可見演算法的應用。演算法要滿足4條性質 1.輸入 2.輸出 3.確定性 4.有限性 複雜性 時間複雜度 t 演算法所求解問題規模n的 函式 漸進時間複雜度 o 當...