程序=数据结构+算法
因此算法分析对于程序设计非常重要。
主要从时间分析和空间分析入手。时间分析:执行代码所需要的时间,反映了代码的时间效率;空间分析:执行代码所需要的空间,反映了空间效率。
tips:程序设计中空间与时间效率常常矛盾,因此需要根据实际问题设计程序。
时间复杂度分析:
算法频度的引入:问题规模为n的函数,表示算法输入量的大小。(用T(n)表示)
#include<iostream>
using namespace std;
bool solve(int a[10][20], int m, int n, int& s) {
if (m != n)
return 0;//算法频度为O(1)
s = 0;//同上
for (int i = 0; i < m; i++) {
s += a[i][i];
}//算法频度为O(n)
return 0;
}
时间复杂度求解:
表示:T ( n )= O ( f ( n ) );
其中O是取数量级算法,主要取f(n)的数量级,f(n)是每一行代码的执行次数;
主要步骤:
1.找出基本语句(执行次数最多的语句),一般为循环;
2.计算f(n);
3.用O取最大的数量级即可。
tips:复杂的代码可以采用演绎法:
如:void example(int& x, int n) {//x=1
for (int i = 0; i < n; i++) {
x = 5 * x;
}
}
解:基本语句:for循环;
第一次循环x=5;
第二次循环x=5*5;
第三次循环x=5*5*5;
。。。。。。。
第k次循环x=5^k;
5^k=n;
得出k=f(n)=log5(n);
例题
例题一:
void fun(int n) {
int i = 0;
while (i <= n)
i += 2;
}
1.基本语句:while循环
2.第一次:i=i+2;
第二次:i=i+2+2;
第三次:i=i+2+2+2;
第k次:i=i+2*k;
假设此时刚好脱离循环:i+2*k=n;
k=n-i/2;故T(n)=O(n);
例题二:
即第一段代码,不做赘述;
例题三:
void fun(int n) {
int i = 0;
int s = 0;
while (s <= n) {
i += 1;
s += i;
}
}
1.基本语句:while循环
2.第一次:i=1;s=0+1;
第二次:i=2;s=1+2;
第三次:i=3;s=1+2+3;
第k次:i=k;s=1+2+3+......+k;
故T(n)=O(sqrt ( n ) );
空间复杂度:
空间=形参占用空间+临时变量占用空间;
注:空间复杂度只考虑临时变量占用空间
同时间复杂度,空间复杂度也用O取数量级;
步骤:找临时变量个数;本文所有代码S(n)=O(1);
int Max(int a[], int n) {
int maxi = 0;
for (int i = 0; i < n; i++) {
if (a[i] > a[maxi])
maxi = i;
return a[maxi];
}
}
S(n)=O( n );