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

本方法从九章算法视频课程中的令狐老师那里学来的,链接一下以表感谢。

本文需要你了解二分算法和分治算法,文内对二分和分治不作详细介绍。

时间复杂度

二分算法,我们比较熟悉,时间复杂度是 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(logN)

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

T( n ) = 2 T( n/2 ) + O( 1 )

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

T( n ) = 8 T( n/8 ) + 7 O( 1 )

…[共 logN 次]

T( n ) = n T( 1 ) + (2 logN - 1)·O( 1 )

T( n ) = O(N)

如有错误,望留言指出。

附注

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

    n * O( 1 ) = O( n );

    c * O( n ) = O( n ); 【常数系数直接省略】

    O( cm ) + O( cn ) = O( cm ); 【常数相加取最大项】

    O( m ) * O( n ) = O( m * n);

  3. 注意理解T(n)O(n)的区别:

    T(n)表示问题规模为 n 的时间复杂度,是一个未知值的表示符号(代数式);

    O(n)表示时间复杂度是O(n),表示的就是一个值,不是一个代数式。只不过这个值是计算机算法领域内的一个值,表示成这个样子也是比较奇葩。

  4. 原文计算的解释

    T( n ) = n T( 1 ) + (2 logN - 1)·O( 1 )

    因为

    T( 1 ) = O( 1 ) ; // 规模为1的问题的时间复杂度为O( 1 )

    (2 logN - 1) ·O( 1 ) = O( logN )

    所以

    T( n ) = O( n ) + O( logN )

    T( n ) = O(n)

时间: 2024-12-23 13:11:27

分治法和二分法的时间复杂度简明分析的相关文章

使用Apriori算法和FP-growth算法进行关联分析(Python版)

===================================================================== <机器学习实战>系列博客是博主阅读<机器学习实战>这本书的笔记也包含一些其他python实现的机器学习算法 算法实现均采用python github 源码同步:https://github.com/Thinkgamer/Machine-Learning-With-Python ==================================

理解动态规划、分治法和贪心法

本文转自:http://www.cnblogs.com/airwindow/p/4067902.html http://hi.baidu.com/35661327/blog/item/d5463e17f1e8d011972b439c.html 动态规划.分治法和贪心法都是利用求解子问题,而后利用子问题求解更上层问题,最终获得全局解决方案的方法. 但是三者的应用场景和性质却存在着极大的不同: 1.分治法 很容易与动态规划问题混淆,但两者却有着本质上的差异. 分治法采用的是递归的思想来求解问题,两个

[BS]初学数据结构的几个基本概念以及时间复杂度的分析

几个基本概念: 数据,数据元素,数据项,数据结构 数据(data):数据是对客观信息的一种描述,它是由能被计算机识别与处理的数值.字符等符号构成的集合.含义较为广泛,意会即可. 数据元素(data element):数据元素是数据的基本单位,在计算机程序中通常作为一个整体进行考虑和处理. 数据项(data item):博主认为可以和数据元素参照理解.在遇到实际问题时我们再做分析. 数据结构(data structures):数据结构分为数据的逻辑结构和数据的物理结构.逻辑结构是面向我们所要研究的

时间复杂度数量级分析

时间复杂度数量级分析 “大 O记法”:在这种描述中使用的基本参数是 n,即问题实例的规模,把复杂性或运行时间表达为n的函数. 注意:“O”表示量级 (order),比如说“二分检索是 O(logn)的”,也就是说它需要“通过logn量级的步骤去检索一个规模为n的数组”记法 O ( f(n) )表示当 n增大时,运行时间至多将以正比于 f(n)的速度增长. 这种渐进估计对算法的理论分析和大致比较是非常有价值的,但在实践中细节也可能造成差异.例如,一个低附加代价的O(n2)算法在n较小的情况下可能比

[转] 理解动态规划、分治法和贪心法

转自:http://www.cnblogs.com/airwindow/p/4067902.html 动态规划.分治法和贪心法都是利用求解子问题,而后利用子问题求解更上层问题,最终获得全局解决方案的方法. 但是三者的应用场景和性质却存在着极大的不同: 1.分治法 很容易与动态规划问题混淆,但两者却有着本质上的差异. 分治法采用的是递归的思想来求解问题,两个分解的子问题独立求解,其之间无任何的重叠.而上一层问题只需要对两个子问题进行一定的merge即可得到答案.即s(t)= s(sub1)+s(s

使用Apriori算法和FP-growth算法进行关联分析

系列文章:<机器学习>学习笔记 最近看了<机器学习实战>中的第11章(使用Apriori算法进行关联分析)和第12章(使用FP-growth算法来高效发现频繁项集).正如章节标题所示,这两章讲了无监督机器学习方法中的关联分析问题.关联分析可以用于回答"哪些商品经常被同时购买?"之类的问题.书中举了一些关联分析的例子: 通过查看哪些商品经常在一起购买,可以帮助商店了解用户的购买行为.这种从数据海洋中抽取的知识可以用于商品定价.市场促销.存活管理等环节. 在美国国会

CNN误差反传时旋转卷积核的简明分析(转)

CNN(卷积神经网络)的误差反传(error back propagation)中有一个非常关键的的步骤就是将某个卷积(Convolve)层的误差传到前一层的池化(Pool)层上,因为在CNN中是2D反传,与传统神经网络中的1D反传有点细节上的不同,下面通过一个简单的例子来详细分解一下这个反传步骤. 假设在一个CNN网络中,P代表某个池化层,K代表卷积核,C代表卷基层,首先来看一下前向(feed forward)计算,从一个池化层经过与卷积核(Kernel)的运算得到卷积层: 将前向计算的步骤进

算法学习---分治法和快速排序

"分治者,分而治之也"分治法的主要思想就是1.若问题足够小,解决并返回 2.若问题规模不够小,减小问题规模.分治法,很容易理解,就是大而化小,小而化了的思想,把问题划分成你能解决的问题. // 分治法 divide_and_conquer(P) { if(|P|<=n0){ process(P); } else{ divide P into smaller subinstances P1,P2,...,Pk for(int I=1;I<k;i++) yi=divide_an

深圳租房简明分析

又是一年毕业季,作为准备来深圳奋斗的人,首先要解决的就是租房问题,趁着刚答辩完的热乎劲,简单分析了一下深圳的租房情况,与大家分享一下.以此献给未来的深圳人以及卡中心的小伙伴们,希望大家都能找到满意的房源. 一.数据覆盖深圳所有区域 首先放一张深圳的区域图,作为后面数据分析的参考,更为细致的地图就需要自己根据不同的需要自行搜索啦.由于每个人的实际情况不同,在租房时的选择也不尽相同,因此分析过程不会给出具体的结论,而是将数据以图表的形式呈现并给出必要的说明,方便个人选择. 租房数据来源于链家,使用爬