时间复杂度
1.算法的执行时间
一个算法执行时间可用该算法中所有语句频度之和来衡量。
//语句频度:一条语句的重复执行次数
//设每条语句执行一次所需的时间均是单位时间
【例 1.4】 求两个n阶矩阵的乘积算法
for(i=1;i<=n;i++)//频度为 n+1——n次:i 在范围内 1次:i 不在范围内 ①
for(j=1;j<=n;j++)//频度为 n*(n+1) n次:i 在范围内的带来的运算
// n+1次:理由同 ①
{
c[i][j]=0;//频度为 n^2i与j都有效才能触发计算
for(k=1;k<=n;k++)//频度为 n^2*(n+1) ……
c[i][j]=c[i][j]+a[i][j]*b[i][j];//频度为 n^3 (n^2*n) ……
}
f(n)=2*n^3+3*n^2+2*n+1
2.算法时间复杂度的简化算法分析
(也是最常见的)
找出程序中频度最大的频度 n^m
则算法的时间复杂度为 T(n)=O(n^m)//T=time,下面的S=space
注意事项:若算法的执行时间不随问题规模n的增长而增长。算法中语句频度就是某个常数。即使这个常数再大,算法的时间复杂度都是O(1)。
例子:for(i=0;i<1000000;i++) {x++;s=0;} //这样叫常量阶
for(i=0;i<1000000;i++) {x++;s=0;}//这样叫线性阶
一个觉得较难的公式:
一般情况下讨论最坏时间复杂度
空间复杂度的计算
空间复杂度的空间指的是对数据进行操作所需要的辅助空间,若该空间相对于输入数据量是个常数,则辅助空间为O(1),称这个算法为原地工作;若所需的辅助空间随问题规模n的变化而变化,那么就要具体分析了……
【例 1.11】 数组逆序
for(i=0;i<n/2;i++)
{
t=a[i];
a[i]=a[n-i-1];
a[i]=t;
} // O(1)
for(i=0;i<n;i++)
b[i]=a[n-i-1];
for(i=0;i<n;i++)
a[i]=b[i]; // O(n)
内容整合自《数据结构(c语言版)(第二版)》 人民邮电出版社 严蔚敏 李冬梅 吴伟民 编著ISBN 978-7-115-37950-4
本人保证不用于商业用途,仅供个人学习使用。如涉及版权问题,请联系本人。