时间复杂程度
首先我们看看啥是时间复杂程度
一般情况下,算法中基本操作重复执行的时间是问题规模 的某个函数 ,算法的渐进时间复杂度(简称时间复杂度(Time
Complexity))记为
它表示随问题规模
的增大,算法执行时间的增长率和
的增长率相同,
一般是算法中频度最大的语句频度。
例如
#define n 自然数 void Matrixmlt(int A[n][n],int B[n][n],int C[n][n]) { int i,j,k; for(i=0;i<n;i++) for(j=0;j<n;j++) { C[i][j]=0; for(k=0;k<n;k++) C[i][j]=C[i][j]+A[i][k]*B[k][j]; } }
|
算法 Matrixmlt
的时间复杂度是T(n)=O(n3),这里的f(n)=n3 是该算法中语句⑤的频度。
由此可见,当有循环嵌套时,算法的时间复杂度是由最内层语句的频度
决定的
上题
计算以下程序段的时间复杂度
for(i=1;i<=n;i++) { s=0; j=1; while(s<=n) { j++; s=s+j; } }
|
由上述知识我们可以知道,这里计算时间复杂度是计算最内层的 循环的频度
外层 循环结束的条件是 ,所以外层循环 次
内层 循环结束条件是 ,巧妙就巧妙在这个
这里,我一开始还没发现(其实是太菜了而且有一段时间没有接触C语言了)
即时间复杂度就是 (这里的
是当外层循环到第 次的时候内层 循环次数)
初始值为 , 每循环一次, 自增并且 ,那么 就可以看作是求所有 循环中 的和
求和公式安排
将 替换为,求解就是
解方程(时间复杂度不能为负)
则时间复杂度
,即