算法效率分析(原創文章)
算法是一系列解決問題的明確指令,對于一定符合規范的輸入,能夠在有限時間內獲得要求的輸出。從實際問題的提出到設計合適的算法再到正確性的分析以及算法效率的分析,最后為算法編寫代碼,一步步得到問題的解決方案。

圖1.算法的概念

圖2.算法設計分析過程
對算法效率的分析,需要指出有兩種算法效率:時間效率和空間效率,分指算法運行速度和需要的額外空間。由于技術革新,對于大多數問題,速度上效率的提高遠大于空間上的提高。在研究算法效率上提出一般性框架。
定義1:如果存在正常數c和
使得當
時
,則記為
。
定義2:如果存在正常數c和
使得當
時
,則記為
。
定義3:
當且僅當
且
。
定義4:如果
且
,則
。
定義的目的實在函數之間建立相對的級別。可直觀的理解為
增長率小于等于
,
增長率大于等于
,
增長率等于
,
增長率小于
。
法則1:如果
且
,那么
(a)
(b)
法則2:如果
是k次多項式,則
法則3:對任意常數k,
下面以最大子序列和問題的四種解決方法來分析算法的效率問題。
最大子序列和:給定整數
(可能含負數),求
最大值(若所有整數為負,則最大子序列和為0)
| 算法 |
1 | 2 | 3 | 4 | |
| 時間 |
![]() |
![]() |
![]() |
![]() |
|
| 輸入大小/m | N=10 |
0.00103 | 0.00045 |
0.00066 |
0.00034 |
| N=100 | 0.47015 |
0.01112 |
0.00486 |
0.00063 |
|
| N=1000 | 448.77 |
1.1233 |
0.05843 |
0.00333 |
|
| N=10000 | NA |
111.13 |
0.68631 |
0.03042 |
|
| N=100000 | NA |
NA |
8.0113 | 0.29832 |


方法一、窮舉嘗試所有可能,含有3重for循環。第一循環大小為N,第二循環大小為
,第三循環大小為
。考慮最差時間效率,第二循環第三循環大小均為N。總數為
。可精確分析,第三循環時間
int MaxSubsequenceSum(const int A[], int N) { int ThisSum, MaxSum, i, j, k; MaxSum = 0; for (i = 0; i < N;i++) for (j = i; j < N; j++) { ThisSum = 0; for (k = i; k <= j; k++) ThisSum += A[k]; if (ThisSum > MaxSum) MaxSum = ThisSum; } return MaxSum; } |

方法二、在方法一的基礎上去掉三重循環,復雜度降為
int MaxSubsequenceSum(const int A[], int N) { int ThisSum, MaxSum, i, j, k; MaxSum = 0; for (i = 0; i < N; i++) { ThisSum = 0; for (j = i; j < N; j++) { ThisSum += A[k]; if (ThisSum > MaxSum) MaxSum = ThisSum; } } return MaxSum; } |
方法三、使用一種遞歸的方法,使復雜度降為
。當問題無法找到
復雜度的線性解法前,該方法很好的體現遞歸的強力。方法使用“分治”策略。將問題“分割”成兩個大致相等的子問題,再將兩個子問題的解合并,再做少量工作使問題解決。
假設測試序列:
| 前半部 | 后半部 | ||||||
| 4 |
-3 | 5 |
-2 | -1 |
2 |
6 | -2 |
1前半部最大子序列和為6(
),后半部最大子序列和為8(
)
2前半部包含最后元素最大和為4(
),后半部第一元素最大和為7(
)
3兩部分最大和11(
)
算法3比前兩種需要更多代碼量,但在運行時間上,特別是大數據量的運算時間,會比前兩種方法節省更多時間。
方法四、極為簡潔而且更加的有效。打破了第二循環和第三循環,使運行時間變為線性。
int MaxSubsequenceSum(const int A[], int N) { int ThisSum, MaxSum, j; MaxSum = ThisSum = 0; for (j = 0; j < N; j++) { ThisSum += A[j]; if (ThisSum > MaxSum) MaxSum = ThisSum; else if (ThisSum < 0) ThisSum = 0; } return MaxSum; } |
在實際的代碼編寫中,對算法復雜度進行估算,可以更加有計劃性的進行算法改進。提高時間效率。
工程師必備
- 項目客服
- 培訓客服
- 平臺客服
TOP
























