学习主定理
之前很早就听机房的学长说主定理了,是用于算法竞赛中分析时间复杂度的,但是一直没有学习过
今天做DS,又遇到了,题目如下
一道考研题目
解析:时间复杂度为
设
由此得到递推公式
故
带回
这也就是归并排序(MergeSort)的时间复杂度
更普适的
假设有递推关系式
其中,
结论:
- 若存在
, (可不严谨的视作多项式地小于),那么 - 若存在
, ,那么 - 若存在
, (多项式地大于),同时存在常数 以及充分大的 ,满足 ,则
符号说明:
更普适的:
更本质的:
使用
1 | f(n) |
这里用
主定理到底在做什么?事实上主定理就是对比这两个部分的时间复杂度罢了
到底是上面那些f(n)
操作加起来更耗时,
还是最下层所有叶节点的O(1)
加起来更耗时?
即对于
代换一下,得到
对于三种情况:
下层所有叶节点的
O(1)
加起来更耗时(即 )的增长速度大于了 , 那么 之所以引入
只是为了说明增长速度大 第一种情况下
代表的最终处理问题的最小子任务明显占了主导 一样耗时
最小子任务和分割过程一样,没有谁明显的占据了主导低位,因此两个的时间复杂度都得算进去
上面那些
f(n)
操作加起来更耗时分治过程占了主导地位,同时这种情况下限制了
不会无法被认为是常数
常见形式
例题
- NOIP2016TGT14
根据主定理,此时
符合格式
所以
选择C
根据主定理,此时
所以
根据主定理,此时
所以
根据主定理,此时
同时存在常数
所以
小结
主定理讨论的是对于公式 p f(n) k
三个变量的增长速度。只不过主定理直接用条件限制了p
,所以我们关注的重点就仅在
f(n)
和 k
上了
reference
https://zh.wikipedia.org/wiki/%E4%B8%BB%E5%AE%9A%E7%90%86
https://blog.restkhz.com/post/how-master-theorem-works
https://blog.csdn.net/lanchunhui/article/details/52451362
https://www.luogu.com.cn/article/w3avh1ku
https://www.mashangxue123.com/tutorials/dsa/master-theorem/
https://www.cnblogs.com/coderzjz/p/14272460.html