当前位置: 首页 > news >正文

【算法复杂度分析】主定理

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

Pic
可见,每次递归把问题分为a个规模为n/b的子问题。从根节点开始,共有logb(n)+1层,叶子节点数为a(logb(n))。那么,第j层共有aj个子问题,每个问题规模为n/bj,每个子问题运算量为c*(n/bj)^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)

Ref:http://blog.csdn.net/caozhk

相关文章:

  • 【BZOJ 3289】Mato的文件管理 【莫队+BIT】
  • 【BZOJ 2336】任务调度 【随机化】
  • 【BZOJ 4542】大数 【莫队】
  • 【BZOJ 1003】[ZJOI2006]物流运输 【SPFA+DP】
  • 【BZOJ 1001】狼抓兔子 【Dinic最小割】
  • Dinic模版+SAP模版
  • 【BZOJ 1001】狼抓兔子 【S-T平面图最大流转对偶图最短路】
  • 【BZOJ 1002】 [FJOI2007]轮状病毒 【矩阵树定理】【留坑】
  • 【BZOJ 1005】[HNOI2008]明明的烦恼 【Prufer序列】
  • Humble Numbers 【数论】【DP】
  • #1014 : Trie树
  • #1015 : KMP算法
  • firefox插件
  • 宗教信仰
  • Gopher II
  • [译] 理解数组在 PHP 内部的实现(给PHP开发者的PHP源码-第四部分)
  • 230. Kth Smallest Element in a BST
  • Docker: 容器互访的三种方式
  • JS题目及答案整理
  • mongo索引构建
  • nginx(二):进阶配置介绍--rewrite用法,压缩,https虚拟主机等
  • Redis 中的布隆过滤器
  • Sequelize 中文文档 v4 - Getting started - 入门
  • 电商搜索引擎的架构设计和性能优化
  • 二维平面内的碰撞检测【一】
  • 浮现式设计
  • 聊聊flink的BlobWriter
  • 如何优雅地使用 Sublime Text
  • 微服务框架lagom
  • 写代码的正确姿势
  • 用jQuery怎么做到前后端分离
  • elasticsearch-head插件安装
  • 摩拜创始人胡玮炜也彻底离开了,共享单车行业还有未来吗? ...
  • ​力扣解法汇总1802. 有界数组中指定下标处的最大值
  • #if和#ifdef区别
  • #微信小程序:微信小程序常见的配置传值
  • ( 用例图)定义了系统的功能需求,它是从系统的外部看系统功能,并不描述系统内部对功能的具体实现
  • (13)[Xamarin.Android] 不同分辨率下的图片使用概论
  • (23)Linux的软硬连接
  • (翻译)terry crowley: 写给程序员
  • (附源码)ssm户外用品商城 毕业设计 112346
  • (强烈推荐)移动端音视频从零到上手(下)
  • (转)Oracle存储过程编写经验和优化措施
  • .Net Web窗口页属性
  • .NET 将混合了多个不同平台(Windows Mac Linux)的文件 目录的路径格式化成同一个平台下的路径
  • .NET/C# 编译期能确定的字符串会在字符串暂存池中不会被 GC 垃圾回收掉
  • /proc/vmstat 详解
  • @Query中countQuery的介绍
  • [1181]linux两台服务器之间传输文件和文件夹
  • [AIGC] Java 和 Kotlin 的区别
  • [bzoj 3124][sdoi 2013 省选] 直径
  • [flume$2]记录一个写自定义Flume拦截器遇到的错误
  • [JS]JavaScript 简介
  • [LeetCode] 93. Restore IP Addresses 复原IP地址
  • [leetcode]Clone Graph