分治法和二分法的时间复杂度简明分析

9 篇文章 1 订阅

本方法从九章算法视频课程中的令狐老师那里学来的,链接一下以表感谢。
本文需要你了解二分算法和分治算法,文内对二分和分治不作详细介绍。

时间复杂度

二分算法,我们比较熟悉,时间复杂度是 O(logN)。
分治算法,时间复杂度是多少呢?大致是O(N)。

为什么区别这么大呢?因为二分是分治的一个特殊情况,二分算法是比较一次,直接扔掉不符合要求的那一半。分治不能这么做,它只是做了划分,并没有减小问题规模。

注:因为分治算法是个统称,这里的时间复杂度也只是个初略计算。

简明分析方法

非常简明的时间复杂度分析方法:

二分:通过O(1)的操作,将规模为 n 的问题变成了 n/2 的问题。
即:T( n ) = T( n / 2 ) + O( 1 )
分治:通过O(1)的操作,将规模为 n 的问题变成了2个 n/2 的问题。
即:T( n ) = 2 T( n / 2 ) + O( 1 )
区别:分治的问题规模并没有变

对上面2个式子进行递推:

T( n ) = T( n/2 ) + O( 1 )
T( n ) = T( n/4 ) + 2 O( 1 )
T( n ) = T( n/8 ) + 3 O( 1 )

…[共 logN 次]

T( n ) = T( 1 ) + logN·O( 1 )
整理
T( n ) = O( 1 ) + O (logN)
常数相加取最大,就有:

T( n ) = O(logN)

n 和 logN 里的 N 意义一致,大小写仅为了美观

分治1次
T( n ) = 2 T( n/2 ) + O( 1 )
分治2次
T( n ) = 4 T( n/4 ) + 3 O( 1 )
分治3次
T( n ) = 8 T( n/8 ) + 7 O( 1 )

…[分治 logN 次]

T( n ) = (n) T( 1 ) + (n-1) O ( 1 )
可理解为:将n个汤圆先分成2大碗,再分成4大碗,最后用n-1次分到n个小碗里。整个过程中汤圆1个也没扔。而二分法每分一次汤圆都把汤圆扔掉了一半。
整理一下:
T( n ) = n*O(1) + O(n-1)
T( n ) = O(n) + O(n-1)
常数相加取最大:
T( n ) = O(n)

T( n ) = O(n)

如有错误,望留言指出。

附注

  1. 在计算机算法这个话题内,log( N ) 若没有特殊说明,一般均指以2为底的对数。

  2. 大O运算法则:

n * O( 1 ) = O( n );
45 * O( n ) = O( n ); 【常数系数直接省略】
O( 7 ) + O( 100 ) = O( 100 ); 【常数相加取最大项】
O( m ) * O( n ) = O( m * n);

  1. 注意理解T(n)O(n)的区别:
    T(n)表示问题规模为 n 的时间复杂度,是一个未知值的表示符号(代数式);
    O(n)表示时间复杂度是O(n),表示的就是一个值,不是一个代数式。只不过这个值是计算机算法领域内的一个值,表示成这个样子也是比较奇葩。

  2. 原文计算的解释

用数学归纳法,分治 logN 次之后,有
T( n ) = 2^logN T( n/2^logN ) + (2^logN - 1)·O( 1 )
T( n ) = N T(1) + (N-1) O (1)
因为:
T( 1 ) = O( 1 ) ; // 规模为1的问题的时间复杂度为O( 1 )
所以有:
T(n) = n O(1) + (n-1) O (1)
T(n) = O(n) + O(n-1)
T(n) = O(n)

  • 7
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 7
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

qilei2010

痛饮夏日的冰阔落

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值