演算法:顧名思義,一種計算的方法,在程式設計上,就表現為一組指令序列。
為了使得演算法有意義,還規定演算法必須是有限的和確定的,也就是說演算法的執行時間有限、執行的過程是確定的。
比如我們寫了**
int a = 10; //a,b為輸入資料
int b = 20;
int c = a+b; //c為輸出資料,演算法為加法運算
這其實就是乙個演算法的具體實現(程式就是演算法的具體實現,但不是所有程式都能認為是演算法的實現,比如while(1) 死迴圈程式,因為不滿足演算法的有限性)。
總結:
當乙個演算法對每組輸入資料,都能得到正確的輸出資料,則稱演算法是正確的,否則稱之為錯誤的。
為了實現同樣乙個需求,可以設計出各種不同的演算法。
典型的,對一組資料排序,可以有直接插入法、氣泡排序法、堆排序等等;
簡單的,實現從1累加到100,可以計算1+2+…+100,也可以計算50*(1+100);
如何評價乙個演算法的優劣?
對於程式設計而言,無非就是兩個方面:演算法有多快?(時間效率);記憶體耗得多不多?(空間效率)
我們稱之為演算法的複雜度分析,包括上述兩個方面,各自稱為時間複雜度分析和空間複雜度分析。通常我們更關注的是演算法的時間複雜度。
設問題規模為n,即輸入資料的大小,時間複雜度記為t(n)
比如n個輸入資料,需要做2*n個基本運算,那麼t(n) = 2*n
下面的程式中,對乙個n資料遍歷了兩次,其t(n) = 2*n
#include #define n 5
int main()
; for(i=0;i
再如巢狀兩次迴圈,每次迴圈都是1至n,則其t(n) = n2
這裡提的基本運算,可以是一條語句,也可以是一組語句,更具實際情況而定。
漸進時間複雜度
通常,我們分析演算法的複雜度不需要考慮的這麼具體,精確到2*n,3*n2+1等等,只需要考慮它的數量級就可以了,這就是漸進時間複雜度o(n),也即是nà∞時,t(n) -> o(n)
備註:準確的說,o(n) 是漸進上界,相對的也就有漸進下界。但在實際分析時,通常直接說某某演算法的時間複雜度為o(n)
o(n) 其實就是t(n)省略了低階項和常數項
比如: t(n) = 2*n 則o(n)=n, 實際中就稱演算法時間複雜度為n
t(n)= 3*n2 則o(n)=n2, 實際中就稱演算法時間複雜度為n2
t(n) =3* log(n)則o(n)=log(n), 實際中就稱演算法時間複雜度為log(n)
分析演算法執行過程中所占用儲存空間大小,其分析和時間複雜度類似。
如果使用1個基本空間單位,則空間複雜度為o(1)
如果使用n個基本空間單位,則空間複雜度為o(n)
這裡說的空間複雜度實際中也是漸進空間複雜度。
以上就是結合實際使用,給出的演算法的基本概念。一般來說,知道這些就夠了。
作者 :jarvischu
出處:
演算法之基本概念1
程式設計是乙個工程學科,能做出東西要比宕機概念強,盡量將概念通俗 簡化。儲存資料的不同方式 同一問題的不同的解決方法 一般是針對特定的資料結構3.1 時間測算 計算演算法時間差 幅度不夠迴圈來湊 如果時間差較小,不容易比較。3.2 空間測算 隨著空間度增加,時間也增加 4.1 時間隨著資料 問題 規...
UML輕鬆入門 基本概念 1
uml輕鬆入門 基本概念 20 世紀80 年代,隨著物件導向技術成為研究的熱點,先後出現了幾十種物件導向的軟體開發方法。其中,booch omt 和oose等方法得到了廣泛的認可。然而,採用不同方法進行建模不利於開發者之間的交流。而uml則統一了booch omt 和oose 的表示方法,而且對其作...
SQL入門學習 1 基本概念
1.1.1 資料庫 儲存有組織的資料的容器。不要與dbms的概念混淆,dbms是指資料庫管理系統,而一般的我們是通過dbms來訪問資料庫的。1.1.2 表 某種特定型別資料的結構化清單 同一資料庫中不能兩次使用相同的表名 模式 schema 關於資料庫和表達布局及特性資訊。1.1.3 列與資料型別 ...