复杂度分析
(一)如何分析、统计算法的执行效率和资源消耗
1、大O复杂度表示法
算法的执行效率,粗略的讲,就是算法代码执行的时间。
所有代码执行的时间T(n)与每行代码的执行次数n成正比。
这个规律总结成一个公式就是大O了
T(n) = O(f(n)
这条公式里,Tn代表的是代码执行的时间,n代表的是数据规模的大小,fn表示每行代码执行的次数总和。公式中的O代表的是代码时间与fn表达式成正比。
下面来举个例子。
int cal(int n) {
int sum = 0;
int i = 1;
for (; i <= n; ++i) {
sum = sum + i;
}
return sum;
}
这段代码中的执行时间预估一下,假设每行代码执行的时间一样,都为一个u的时间。
第1,2行都只执行了一次,而第3,4行都同时执行了n遍,所以这段代码总的执行时间为
(2n+2)*u。也就是Tn = O(2n+2)
大O时间复杂度并不具体表示代码真正的执行时间,而是表示代码执行时间随数据规模增长的变化趋势,所以也叫做渐进时间复杂度,简称时间复杂度。
在上面例子中,当n很大的时候,常量2,系数2都可以忽略不记,我们只需要记录一个最大的量级就可以了。也就是可以记为Tn = O(n)
2、时间复杂度分析
(1)只关注循环次数最多的一段代码。这段核心代码执行次数的n的量级,就是整段要分析代码的时间复杂度。
比如上面的例子
int cal(int n) {
int sum = 0;
int i = 1;
for (; i <= n; ++i) {
sum = sum + i;
}
return sum;
}
其中2、3行代码都是常量级的执行时间,与n的大小无关,所以对于复杂度并没有影响。循环执行次数最多的就是第4、5行代码,所以这块代码要重点分析。
(2)加法法则:总复杂度等于量级最大的那段代码的复杂度。
int cal(int n) {
int sum_1 = 0; //1
int p = 1;// 1
for (; p < 1