您的位置:首页 > 其它

如何计算时间复杂度

2016-10-09 19:05 281 查看
一. 概念
时间复杂度描述的是程序的执行时间,时间复杂度越低,执行效率越高
时间复杂度是总运算次数表达式中受n的变化影响最大的那一项(不含系数)
影响从大到小: 不考虑系数
n! >  2^n (指数阶) > n^3 (立方阶)> n^2 (平方阶)> nlog2n(线性对数阶) > n (线性阶) > log2n (对数阶) > 1 (常数阶)
二. 计算方法
找到循环里的最基本的操作,把每个最基本操作的执行次数相加,找对N最大影响的那一项
其实就是找最深层循环里的基本操作的执行次数就可以了
最常用的循环方法的时间复杂度
(1)  for(i=1;i<=n;i++)  // 外循环执行了n次
for(j=1;>j<=n;j++)  // 内循环执行了n次
s++;  //基本操作,一共循环了n*n次,当然是O(n^2)
(2) for(i=1;i<=n;i++)  //外循环执行了n次
            for(j=i;j<=n;j++)  // 内循环每次的执行次数不一样,i=1,执行n次,i=2,执行n-1次,依次递减s++;   //循环了(n+n-1+n-2+...+1)≈(n^2)/2,因为时间复杂度是不考虑系数的,所以也是O(n^2)
1+2+3+... + n = (n^2)/2
推导:
s = 1+2+3+... +n;
s = n+n-1+... +2+1
2个公式相加,每一项都是n+1,一共n项,则2s=n(n+1);  s= n(n+1)/2, 取最高阶,不考虑系数就是O(n^2)
简单点:2重循环一般就是n2
(3)
for(i=1;i<=n;i++)     //循环了(1+2+3+...+n)≈(n^2)/2,当然也是O(n^2)for(j=1;j<=i;j++)s++;
和上面的2是反着的。上面内循环每次循环的开始值是i,最大值固定是n,循环次数逐渐递减
这个内循环每次循环的开始值固定是1,最大值是i,循环次数逐渐递加
简单点:2重循环一般就是n2
(4)
for(i=1;i<=n;i++)
for(j=1;j<=i;j++)  // j与i相关,循环次数不固定
for(k=1;k<=j;k++)  // k与j相关,循环次数不固定
x=x+1;
循环了(1^2+2^2+3^2+...+n^2)=n(n+1)(2n+1)/6(这个公式要记住哦)≈(n^3)/3,不考虑系数,自然是O(n^3)
简单点:三重循环一般就是n3
i=1时,二层循环1次,三层循环一次, 总共1次
i=2时,二层循环2次,三层循环二次,总共4次
i=3时,二层循环3次,三层循环分别执行1+2+3次共6次 ,总共9次
(5)
for(i=1;i<=n;++i){for(j=1;j<=n;++j){c[ i ][ j ]=0;   //该步骤属于基本操作 执行次数:
                for(k=1;k<=n;++k)c[ i ][ j ]+=a[ i ][ k ]*b[ k ][ j ]; //该步骤属于基本操作 执行次数:}}则有 T(n)= n^2+n^3,则该算法的 时间复杂度:T(n)=O(n^3)
总结:
简单的计算的话,看看有几重for循环,只有一重则时间复杂度为O(n),二重则为O(n^2),依此类推,如果有二分则为O(logn),二分例如快速幂、二分查找,如果一个for循环套一个二分,那么时间复杂度则为O(nlogn)。

                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: