博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
主定理的证明及应用举例
阅读量:4088 次
发布时间:2019-05-25

本文共 1339 字,大约阅读时间需要 4 分钟。

主定理

主定理最早出现在《算法导论》中,提供了分治方法带来的递归表达式的渐近复杂度分析。

规模为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)

 

主要记住nlogba和f(n)的关系,即可,大于为情况1,等于为情况2,小于为情况3.

T(n)=aT(n/b)+f(n)

1)       e>0, F(n)=O(nlogba-e),复杂度为T(n)=theta(nlogba):例如T(n)=9T(n/3)+ n,  theta(n2)

2)       f(n)=theta(nlogba),复杂度为T(n)=theta(nlogba*logn)。例如:T(n)=25T(n/5)+O(n2),theta(n2logn)

3)       e>0, F(n)=W(nlogba+e),复杂度为T(n)=theta(f(n)).例如T(n)=3T(n/4)+cn2,theta(n2)

你可能感兴趣的文章
JS实现2,8,10,16进制的相互转换
查看>>
mysql的存储函数和存储过程
查看>>
nginx和ftp搭建图片服务器
查看>>
solr5.5基础教程
查看>>
Java中的Zip进行多文件的保存
查看>>
微信扫码支付官方下载的demo本地运行时遇到的坑以及对应解决方法
查看>>
关于js中连续click时不执行访问后台请求,当点击停止2s之后,立即发起访问后台的请求的解决方案
查看>>
RESTClient工具访问服务如何传参
查看>>
MySQL中的分组查询与连接查询语句
查看>>
浮点数精度控制方式总结(含mysql和java)
查看>>
并发限流工具类RateLimiter介绍
查看>>
如何配置Tomcat使用https协议
查看>>
linux下安装mariadb以及相关配置
查看>>
Java中的Gzip进行多文件的保存
查看>>
Java中的Future模式原理自定义实现
查看>>
vmware桥接模式下,配置centos的ip地址网关等,搭建局域网服务器
查看>>
xstream练习
查看>>
调度框架Quartz
查看>>
由单线程到多线程生产消费模式的代码改造历程
查看>>
windows解压缩版mysql5.6.40安装
查看>>