复杂度分析:如何分析代码执行效率和资源消耗
(一)大O(字母大写O)复杂度表示法
若将每条语句执行的单位时间看作一致的,也就将得出一个规律:一段代码的执行时间T(n)
与每一条语句总的执行次数(累加数)成正比。即公式:
T(n) = O(f(n))
其中T(n)
代表代码执行的总时间 ;n
表示数据规模; f(n)
表示每条语句执行次数的累加和,此值与n
密切相关;公式中的O
表示T(n)
与f(n)
成正比。
实际上,大O时间复杂度并不真正具体表示代码执行时间,而是表示代码执行时间随数据规模增大的变化趋势,因此也称为渐进时间复杂度(asymptotic time complexity),简称时间复杂度。
当n
很大时,公式中的低阶、常量、系数三部分并不左右增长趋势,因此可忽略。此时,只需记最大量级。形如:
T(n) = O(2n+3) => T(n) = O(n)
注:非O(2n), O表示的是变化趋势,而不是某一具体关系。
T(n) = O(2n^2 + 2n + 3) => T(n) = O(n^2)
注:非O(n2 + n),n2 >> n,故n被忽略。
(二)时间复杂度分析方法
1.加法法则
代码总的复杂度等于量级最大的那段代码的复杂度。
我们通常会忽略公式中的常量,低阶和系数只记录最大量级。
如下面一个例子:
int cal(int n) {
int sum_1 = 0;
int p = 1;
for(; p <= 100; ++p) {
sum_1 = sum_1 + p;
}
int sum_2 = 0;
int q = 1;
for(; q <= n; ++q) {
sum_2 = sum_2