高效计算时间复杂度

题目来自王道的书,有些方法是自己总结的,有错的地方见谅

一个语句的频度是指该语句在算法中被重复执行的次数。算法中所有语句的频度之和记为T(n),它是该算法问题规模n的函数,时间复杂度主要分析T(n)的数量级。
算法中基本运算(最深层循环内的语句)的频度与Tn)同数量级,因此通常采用算法中基本运算的频度fn)来分析算法的时间复杂度3。
因此,算法的时间复杂度记为:T(n)= O(fn))


void fun(int n){
int i = 1;
while (i <= n){ //设t为执行次数,根据i决定
i = i * 2;
}
}

有一种比较笨,但好用的方法,列举法,大部分题目都可以用这种方法
我们t理解为第几次执行,然后写一个表格,i是每一次循环结束i的值


t i
1 2
2 4
3 6
4 8

求出i的数列:2,4,6,8 ......2n
∴i = t2
t是执行的次数,O(t)为复杂度
t2 = n
t = log2n
∴O(t) = O(log2n)


关于for循环


int m = 0,i,j;
for (i = 1; j <= n; i++){
for (j = 1; j<= 2*i; j++){
m++;
}
}

双重for循环一般可以用求和公式

t = i=1nj=12i1
t = (1+n)n
T(n) = O(t) = O(n2)
直接求出t的循环次数,如果用列举法的话,j的范围会随着i的改变而改变,找到t的规律比较困难

关于递归


int fact(int n){
if (n <= 1){return 1;}
return n* fact(n-1);
}

换个思路看这道题,就是从1加到n,用列举法得数列:1,2,3,4......n
t = n
∴T(n) = O(n)

本文作者:MiYol

本文链接:https://www.cnblogs.com/miyol/p/16722625.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   MiYol  阅读(21)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起
  1. 1 红昭愿 音阙诗听
  2. 2 恋人心 兰音-Reine
  3. 3 Spica HUMMING LIFE
红昭愿 - 音阙诗听
00:00 / 00:00
An audio error has occurred, player will skip forward in 2 seconds.