算法的出現(xiàn),遠遠早于計算機,所以關(guān)于算法的知識點也非常多,大家不要急于求成,而本篇將從算法的概念、特征、評價以及復雜度四個方面詳細介紹算法,希望關(guān)于算法的內(nèi)容給大家一個清晰的認識,方便大家在日后的運用有更深的概念。
一、算法的概念
算法(algorithm,[??lɡ?r?e?m],計算程序):就是定義良好的計算過程,他取一個或一組的值為輸入,并產(chǎn)生出一個或一組值作為輸出。簡單來說算法就是一系列的計算步驟,用來將輸入數(shù)據(jù)轉(zhuǎn)化成輸出結(jié)果。
算法(algorithm)是解決一系列問題的清晰指令,也就是,能對一定規(guī)范的輸入,在有限的時間內(nèi)獲得所要求的輸出。
簡單來說,算法就是解決一個問題的具體方法和步驟。
程序 = 算法+數(shù)據(jù)結(jié)構(gòu)
二、算法的特征
(1)可行性
算法中執(zhí)行的任何計算步驟都可以分解為基本可執(zhí)行的操作步,即每個計算步都可以在有限時間里完成(也稱之為有效性)。
(2)確定性
算法的每一步都要有確切的意義,不能有二義性。例如“增加x的值”,并沒有說增加多少,計算機就無法執(zhí)行明確的運算。
(3)有窮性
算法的有窮性是指算法必須在執(zhí)行有限個步驟后終止。操作次數(shù)不宜過大,不能超過人們事先設定的時間限制。
(4)輸入
算法有0個或多個輸入,以刻畫運算對象的初始情況,所謂0個輸入是指算法已經(jīng)給出了初始條件。
(5)輸出
一個算法可能有1個或多個輸出,以反映輸入數(shù)據(jù)加工后的代碼,沒有輸出的算法是沒有意義的!
三、算法的評價
通常一個好算法應該達到如下目標:
(1)正確性
算法應該正確的解決問題。
(2)可讀性
算法應該具有較好的可讀性,讓人們理解算法的作用。
(3)健壯性
輸入非法數(shù)據(jù)時,算法也可以做出適當?shù)姆磻粫a(chǎn)生奇奇怪怪的輸出。
四、算法的復雜度
算法復雜度是指算法在變?yōu)榭蓤?zhí)行程序后所耗費的時間資源和內(nèi)存。
(1)時間復雜度:評估程序所需要的時間。
復雜度 | 標記符號 | 說明 |
常量 | O(1) | 操作數(shù)量為常數(shù),與輸入數(shù)據(jù)的規(guī)模無關(guān) |
對數(shù) | O(log2 n) | 與輸入數(shù)據(jù)的比例是 log2(n) |
線性 | O(n) | 與輸入數(shù)據(jù)成正比 |
平方 | O(n2) | 與輸入數(shù)據(jù)規(guī)模的比例為平方 |
立方 | O(n3) | 與輸入數(shù)據(jù)規(guī)模的比例為立方 |
指數(shù) | O(2?) O(k?) O(n!) | 快速增長,盡量減少這種代碼 |
示范:
1. O(1)級代碼
//計算長方形面積 int a,b; cin>>a>>b; int s = a*b; cout<<s;
2. O(log2 n)級代碼
//二分查找 int search(int nums[], int size, int target) //nums是數(shù)組,size是數(shù)組的大小,target是需要查找的值 { int left = 0; int right = size - 1; // 定義了target在左閉右閉的區(qū)間內(nèi),[left, right] while (left <= right) { //當left == right時,區(qū)間[left, right]仍然有效 int middle = left + ((right - left) / 2);//等同于 (left + right) / 2,防止溢出 if (nums[middle] > target) { right = middle - 1; //target在左區(qū)間,所以[left, middle - 1] } else if (nums[middle] < target) { left = middle + 1; //target在右區(qū)間,所以[middle + 1, right] } else { //既不在左邊,也不在右邊,那就是找到答案了 return middle; } } //沒有找到目標值 return -1; }
3. O(n)級代碼
//計算n的階乘 int n; cin>>n; int ji = 1; for(int i = 1 ; i<=n ; i++){ ji*=i; } cout<<ji<<endl;
(2)空間復雜度:評估程序所需要的儲存空間??臻g復雜度一般不作考慮,一般都優(yōu)先考慮時間復雜度。
以上是關(guān)于算法知識的介紹,有了基礎(chǔ)概念的理解,方便后期我們學習算法的運用和實操。
C語言網(wǎng)提供由在職研發(fā)工程師或ACM藍橋杯競賽優(yōu)秀選手錄制的視頻教程,并配有習題和答疑,點擊了解:
一點編程也不會寫的:零基礎(chǔ)C語言學練課程
解決困擾你多年的C語言疑難雜癥特性的C語言進階課程
從零到寫出一個爬蟲的Python編程課程
只會語法寫不出代碼?手把手帶你寫100個編程真題的編程百練課程
信息學奧賽或C++選手的 必學C++課程
藍橋杯ACM、信息學奧賽的必學課程:算法競賽課入門課程
手把手講解近五年真題的藍橋杯輔導課程