高效计算时间复杂度
题目来自王道的书,有些方法是自己总结的,有错的地方见谅
一个语句的频度是指该语句在算法中被重复执行的次数。算法中所有语句的频度之和记为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 =
t是执行的次数,O(t)为复杂度
∴= n
t =
∴O(t) = O()
关于for循环
int m = 0,i,j; for (i = 1; j <= n; i++){ for (j = 1; j<= 2*i; j++){ m++; } }
双重for循环一般可以用求和公式
t =
t = (1+n)n
T(n) = O(t) = O()
直接求出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 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步