为什么要进行算法分析
解决同一个问题可以有许多算法,但如果我们要寻求问题的最优解,就需要分析算法的时间和空间复杂度,现行计算机空间较大,因此空间问题相比于时间问题就没那么重要了。
算法分析的方法
在计算机上运行程序并计时
计数所需要执行的指令
和已知的算法比较
几个定义
O(n) (n) (n)
渐近分析
将输入规模逐渐增大,测量算法的开销
最好,最坏,平均情况
best case
avarage-case
反映平均行为,一般进行算法分析时采用
bad-case
最差的情况,反映这个算法的最差性能
时间分析的两种方法
得到表达式(时间函数)
例如 T(n)= 3 n + 4
/*
for 循环
*/
int sum(int n)
{
int sum=0; c1
for(int i=0;i<=n;i++) c2*n
for(int j=0;j<=n;j++) c3*n
sum++; c4*n^2
}
/* 一条语句执行所需时间为常数,乘以它所执行的次数就是这条语句执行的总时间
T(n)=c1+(c2+c3)n+c4*n^2;
所以T(n)=O(n^2)
我们得到最后的时间函数然后分析
然而,一般情况下我们只需要分析耗时间最长的语句所需要时间的量级,
而非具体给出时间函数就可以进行算法分析
有时我们甚至无法给出时间函数,因为对于不同的值有不同的情况,因此我们使用平均情况
*/
使用平均情况
/*
使用平均情况的例子
*/
//假设有一个数组A[n]包含n个数【0~n-1】,位置是随机的
int sum=0;
for(int i=0;i<n;i++)
for(int j=0;A[j]!=i;j++)
sum++;