时间复杂度

时间复杂度

衡量算法的优劣是通过时间空间两个维度去衡量,时间复杂度是执行当前算法所消耗的时间,一个程序在计算机上运行时所消耗的时间取决于下列因素:
(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)

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值