时间复杂度
衡量算法的优劣是通过时间与空间两个维度去衡量,时间复杂度是执行当前算法所消耗的时间,一个程序在计算机上运行时所消耗的时间取决于下列因素:
(1) 算法采用的策略、方法;
(2) 编译产生的代码质量;
(3) 问题的输入规模;
(4) 机器执行指令的速度。
n称为问题的规模,当n不断变化时,时间频度T(n)也会不断变化
一般情况下,算法中基本操作重复执行的次数是问题规模n的某个函数,用T(n)表示,O(f(n)) 为算法的渐进时间复杂度,简称时间复杂度。
思考:
1、通过O(n)的时间,把n的问题,变成了n/2的问题,复杂度是多少?
2、通过O(1)的时间,把n的问题,变成了两个n/2的问题,复杂度是多少?
1、通过O(n)的时间,把n的问题,变成了n/2的问题,复杂度是多少?
T(n)=T(n/2)+O(1)=O(logn)
T(n)=T(n/2)+O(n)=O(n)
(1)T(n)=T(n/2)+O(1)=?
T(n) = T(n/2) + O(n) = (T(n/4) + O(n/2)) + O(n) = … 约等于O(logn)
比如二分法,通过O(1)的时间,把n的问题,变成了n/2的问题,舍弃到其中不满足条件的一半,继续划分,二分查找在最坏的情况下依次是n/2,n/4,n/8。。。。 一直到1为止,n(1/2)x = 1 得出x = logn
(2)T(n)=T(n/2)+O(n)=?
T(n)<= n + n/2 + n/4 +…1 + O(n) = 2n-2 + O(n)= O(n)
2、通过O(1)的时间,把n的问题,变成了两个n/2的问题,复杂度是多少?
T(n)=2T(n/2)+O(1)=?
T(n)=2T(n/2)+O(n)=?
带系数2T(n/2) 可以通过树型分析法
(1)T(n)=2T(n/2)+O(1)=?
分析如下:
将n拆分成两个n/2,需要花费O(1)的时间
将两个n/2拆分成4个n/4, 需要花费O(2)的时间
将四个n/4拆分成8个n/8,需要花费O(4)的时间
…
树总共有logn层,但是每一层耗费并不一样,将O(1) +O(2) + O(4) +…+ O(n/2) = O(1 + 2 + 4 +… + n) = O(n)
(2)T(n)=2T(n/2)+O(n)=?
分析如下:
将n拆分成两个n/2,需要花费O(n)的时间
将两个n/2拆分成4个n/4, 需要花费O(n/2) + O(n/2) = O(n)的时间
将四个n/4拆分成8个n/8,需要花费O(n/4) + O(n/4) + O(n/4) + O(n/4) = O(n)的时间
树高为logn,每层都是O(n), 所以时间复杂度为O(nlogn)
归并排序跟快排最好的情况是O(nlogn)
归并排序:左边排序 右边排序 将排序后的结果合并到一起
快排:通过枢轴划分为两部分,再分别进行排序
二叉树的时间复杂度呢?
是T(n) = 2T(n/2) + O(1)