如果已知:
T(n)=aT(⌈bn⌉)+O(nd)(a>0,b>1,d≥0)
那么我们就可以将其转换为大O表示法:
T(n)=⎩⎨⎧O(nd)O(ndlogn)O(nlogba)if d>logbaif d=logbaif d<logba
我们可以对 a、b、d进行如下解释:
- a: 每个问题会分裂的子问题个数
- b: 问题规模缩小的因子
- nd: 每个子问题处理的代价
所以,对于原式中的两个式: - aT(⌈bn⌉): 当前的分裂子问题所消耗的成本
- O(nd): 每个子问题所消耗的成本
考虑一颗递归树,这就是两股势力的竞争,哪股势力增长越快,谁就能主导大O表示法
因此,我们将d和logba进行比较即可,哪个大选哪个
T(n)={O(nd)O(nlogba)if d>logbaif d<logba
如果他们相等的话,任何一边的影响就都无法忽略不计了,因为一共有logn层,所以我们再乘上logn
最终合并起来:
T(n)=⎩⎨⎧O(nd)O(ndlogn)O(nlogba)if d>logbaif d=logbaif d<logba
尝试变形成这种形式
- 非分治递归 (如T(n)=T(n−1)+...)
- a或b并非常数