目录
目录
一、初识时间复杂度
例1:
查看代码执行了几步
答:执行了两次
- println
- return
例2:
查看代码执行了几步
答:执行了九次,公式3n+3次,n == i
步骤:
- int i = 0;
- i < 2;
- println
- i++ 此刻i = 1
- i < 2
- println
- i++ 此刻i = 2
- i < 2
- return
总结:
一段代码的执行次数会用 T(n) 表示
n:数据输入的大小或者是输入数据的数量
T:在输入数量为n的时候这一段代码的总执行次数
所以
例1的执行次数是:T(n) = 2
例2的执行次数表示为:T(n) = 3n + 3
问题:T(n) 作为衡量代码的执行速度的依据,当代码比较多的时候,再去使用就会比较麻烦,还要一条条语句去数,而且函数调用函数时,运算起来也很麻烦,所以算法使用 T(n) 简化的估算值来衡量代码的执行速度,这个简化的估算值叫做时间复杂度
再次强调:
- 一段代码的执行次数会用 T(n) 表示
- 算法使用 T(n) 简化的估算值来衡量代码的执行速度,这个估算值叫时间复杂度
那么估算值怎么计算的的呢????
二、时间复杂度计算
方式一:T(n) = 常数
T(n) = 常数时 ,T(n) 估算为1
所以 例1中T(n) = 2 的时间复杂度是 1
方式二:T(n) = 常数*n + 常数
T(n) = 常数*n + 常数 时
- 后面的常数可以省略掉,因为随着n的增大,第一部分(常数*n)会越来越大,而第二部分一直不变,也就是说,第二部分相当于第一部分与第二部分相比相当于不存在,所以可以直接省略,最后变成了T(n) = 常数*n
- 然而常数又可以直接当成1,所以最终的结果是: T(n) = n
方式三:多项式
面对多项式,只需要保留最大的次方数
比如:T(n) = 5n³+6666n² + 233 时间复杂度为 T(n) = n³
说明:
因为随着n的增大,后面的项的增长远远不及n的最高次项大,所以可以直接省略低次项
方式四:对数
下面有
总结
如下这总时间复杂度表示并不完整
T(n) = 2 → T(n) = 1
T(n) = 3n + 3 → T(n) = n
T(n) = 5n³+6666n² + 233 → T(n) = n³
应该再加上大写字母O,如下
T(n) = 2 → T(n) = O(1)
T(n) = 3n + 3 → T(n) = O(n)
T(n) = 5n³+6666n² + 233 → T(n) = O(n³)
口算练习
练习 1
如下代码的时间复杂度是多少?
答:O(1);
练习 2
如下代码的时间复杂度是多少?
答:O(n);
练习3
如下代码的时间复杂度是多少?
答:O(n²);
所以有几次循环,时间复杂度就是n的多少次方,故此:a重循环,时间复杂度就是O(n^a)
练习4
如下代码的时间复杂度是多少?
答:O(n²);
因为:T(n) = n² + n = O(n²);
练习5
如下代码的时间复杂度是多少?
答:还是 O(n²);
思考
思考 1
如下代码的时间复杂度是多少?
当i = 0 时,内循环就会执行 n 次
当i = 1 时,内循环就会执行 n - 1 次
当i = 2 时,内循环就会执行 n - 2 次
以此类推 ... ... 直到
当i = n - 2 时,内循环就会执行 2 次
当i = n - 1 时,内循环就会执行 1 次
大师,我悟了... ...😀😀😀 😀😀😀
结果也就是一个等差数列
也就是O(n²);
思考 2
当 n = 8时,代码执行了几步?
当 n = 16时,代码执行了几步?
答:T(8) = 3;
T(16) = 4;
代码执行步数有了,那么时间复杂度时多少?
发现代码执行步数取决于 i*=2
你悟了吗... ...
将T(n)放到等号的左边
然后去掉时间复杂度和常系数,故此得
log2n的底数和系数也要去掉,得
O(log n)
时间复杂度对比
1.O(1)
时间复杂度是一条直线
2.O(log n);
随着数据量越来越大,时间复杂度越来越小,最后趋向于一条直线
3.O(n)
时间复杂度随着数据量的增大而增大
4.O(n log n)
5.O(n²)
6.O(n³)
7.O(2^n)
总结:时间复杂度排序
由低到高如表
另外:
文章说明:
文章是看的B站视频做的笔记,视频链接是