主定理(Master Theorem)与时间复杂度
来源:互联网 发布:linux下备份文件命令 编辑:程序博客网 时间:2024/05/20 08:25
主定理
主定理最早出现在《算法导论》中,提供了分治方法带来的递归表达式的渐近复杂度分析。
规模为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)
阅读全文
0 0
- 主定理(Master Theorem)与时间复杂度
- 主定理(Master Theorem)与时间复杂度
- 主定理 Master Theorem
- 主定理笔记(master theorem)
- 时间复杂度与主定理
- 通项求解-主定理Master theorem
- 【算法·基本概念】master theorem 主定理
- 主项定理Master Method 计算时间复杂度
- 算法的复杂度与Master定理
- 算法的复杂度与Master定理
- 算法的复杂度与Master定理
- 离散数学及其应用学习笔记——主定理(Master Theorem)的证明
- 时间复杂度算法主定理
- 主定理与递归树计算算法时间复杂度
- 算法时间复杂度的表达-渐进符号与主定理
- 【数据结构】根据主定理,计算时间复杂度
- 算法导论-计算时间复杂度主定理
- 算法导论-计算时间复杂度主定理
- [容易] UVa OJ 673 经典括号匹配问题
- 多态理解
- 【TensorFlow】Windows10 64位下安装TensorFlow
- Iterator
- 测试计划、测试设计、测试执行
- 主定理(Master Theorem)与时间复杂度
- Linux下交叉编译gdb,gdbserver+gdb的使用以及通过gdb调试core文件
- Spring源码深度解析(二)容器的基本用法
- matlab冒号的用法总结
- 没有任何需求的情况下,如何展开性能测试工作
- 信号槽
- Web应用中设置了异常统一处理页面,捕捉指定异常时的处理问题
- Java利用fastdfs-client-java开发工具包操作FastDFS分布式文件系统
- Android系统所有可申明权限