主定理的证明及应用举例

主定理的证明及应用举例主定理主定理最早出现在 算法导论 中 提供了分治方法带来的递归表达式的渐近复杂度分析 规模为 n 的问题通过分治 得到 a 个规模为 n b 的问题 每次递归带来的额外计算为 c n d T n aT n b c n d 那么就可以得到问题的复杂度为

主定理

  • T(n) = O(n^d log(n)), if a = b^d
  • T(n) = O(n^d ), if a < b^d
  • T(n) = O(n^logb(a))), if a > b^d

证明方法

本来使用主定理是可以免去画递归树的,但为了证明主定理,还是需要画树。

主定理的证明及应用举例

可见,每次递归把问题分为a个规模为n/b的子问题。从根节点开始,共有logb(n)+1层,叶子节点数为a^(logb(n))。那么,第j层共有a^j个子问题,每个问题规模为n/b^j,每个子问题运算量为c*(n/b^j)^d需要完成的计算量为:

主定理的证明及应用举例

求和得到整个问题的运算量:

主定理的证明及应用举例

那么,根据a与b^d的关系,很容易得到主定理。

应用

二分搜索

  • 每次问题规模减半,a=1,b=2,d=0
  • 复杂度为n^0 log(n) = log(n)。

快速排序

  • 随机选择待排序序列中的一个数字作为划分字问题的标准,划分是否平均影响算法复杂度
  • 每次问题规模减半,a=2,b=2,d=1
  • 复杂度为n^2 log(n)
  • 最差情况下,复杂度为O(n^2)

归并排序

  • 数据列均分为两部分,分别排序,之后以O(n)的复杂度进行合并,空间复杂度O(n)
  • 每次问题规模减半,a=2,b=2,d=1
  • 复杂度为n log(n)

基数排序(Radix sort)

  • 对于待排序的整数序列,从最低位到最高位每次按照相应的位排序一次
  • 每次递归问题规模变为原来的1/10,但需要求解10个子问题,额外运算为O(n)的,a=10,b=10,d=1
  • 复杂度为n^1 log(n) = n log(n),近似为O(kN),k为整数的位数

快速傅里叶变换:FFT

  • 每次问题规模减半,a=2,b=2,d=1
  • 复杂度为n log(n)

Karatsuba快速乘法

  • 正常两个n位数乘法为n^2
  • 算法把两个乘数各分为高低位两部分,如X*Y = (a+b) * (c+d) = ac+bd + (bc+ad) = ac+bd+(ac+bd – (a-b)(c-d))
  • 只需要ac,bd,(a-b)(c-d)三次乘法
  • 每次问题规模减半,但需要解3个子问题,加法是O(n)的,a=3,b=2,d=1
  • 复杂度为n^log2(3)


转载请注明作者:Focustc,博客地址为 http://blog.csdn.net/caozhk,原文链接为 点击打开

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/232242.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • LTE学习笔记:频带、信道带宽和频点号EARFCN「建议收藏」

    LTE学习笔记:频带、信道带宽和频点号EARFCN「建议收藏」转自:https://blog.csdn.net/m_052148/article/details/513222601.频带(Band)所谓频带,指代的是一个频率的范围或者频谱的宽度,即无线解码器的最低工作频率至最高工作频率之间的范围,单位是Hz。为了方便起见,在LTE中,使用数字1-43来表示不同的频带(36101-V10.21.0版本协议),从而指代不同的频率范围。协议36101规…

    2022年10月11日
    4
  • 兴师动众解决由cookie引发的400报错问题

    兴师动众解决由cookie引发的400报错问题背景是这样的,做的是一个机票的购票业务,包括了购票(单程购票和往返购票)等功能。购票的航班信息需要从航班搜索页带到下单页,所以在跳转至下单页前将航班信息存在了cookie,用于在下单页展示所选航班信息。遇到的问题是购买单程机票的时候,一切流程正常(从航班查询页,选择需要的购买的航班,进入到下单页,进行下单操作);但是购买往返机票的时候,进入到下单页时,发现下单页所有接口都报了400的错误,继而再访问该网站的其他页面也都报了400的错误。一般来说400报错是因为前后端参数格式或者请求头不一致导致的问题,前.

    2022年6月10日
    36
  • Django(54)drf视图家族[通俗易懂]

    Django(54)drf视图家族[通俗易懂]视图家族drf的视图总共分为以下4个,对应4个源码文件views:视图类generics:工具视图mixins:视图工具集viewsets:视图集学习曲线我们学习视图,可以按照以下的曲线

    2022年7月31日
    6
  • 解决Unable to connect to Redis server: 192.168.110.1/192.168.110.1:6379[通俗易懂]

    解决Unable to connect to Redis server: 192.168.110.1/192.168.110.1:6379[通俗易懂]出现场景:springboot整合redis,启动项目时出现原因:redis的一系列配置不正确解决方案:首先在window安装redis,找到安装目录下的redis.windows.confredis.windows-service.conf1)修改protected-modeyes改为:protected-modeno2)注释掉#bin127.0.0.13…

    2022年6月5日
    279
  • 使用控件的RenderControl()方法导出Excel「建议收藏」

    使用控件的RenderControl()方法导出Excel「建议收藏」使用控件的RenderControl()方法生成HTML表格       stringstrName=”HuaMingCe”;       Response.Clear();       Response.Buffer=true;       Response.Charset=”utf-8″;       Response.AppendHeader(“Content

    2022年7月20日
    15
  • [Android]Activity跳转传递任意类型的数据、Activity为SingleTask时代替StartActivityForResult的解决方案…

    [Android]Activity跳转传递任意类型的数据、Activity为SingleTask时代替StartActivityForResult的解决方案…

    2021年9月5日
    51

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号