萌新刚学 OI,在网上看了 114514 篇介绍主定理的文章,感觉都太过抽象。它们都说主定理是用来求时间复杂度的,但是它们都没有给出一个具体的例子演示它到底是怎么运作的!这无疑对新人很不友好。
我在研究了维基百科的这个条目很久以后,得出了一些我的理解,但是我不知道它们是否正确,希望大佬们指正。我对主定理还有许多疑问,希望大佬们也回答一下。
- 我的理解:主定理只能用于求递归或分治算法的时间复杂度。例如二分查找,它是一个分治的算法,因此可以用主定理来计算它的时间复杂度。而冒泡排序不是一个递归或分治的算法,因此不能用主定理来计算。
- 用于主定理计算的递归关系式究竟是怎么来的?
根据维基百科:
“假设有递推关系式 T(n)=aT(bn)+f(n),其中 n 为问题规模,a 为递归的子问题数量,bn 为每个子问题的规模(假设每个子问题的规模基本一样),f(n) 为递归以外进行的计算工作……”
维基百科还给出了几个算法的递推关系式,例如二分查找的递推关系式为 T(n)=T(2n)+O(1),二叉树遍历的递推关系式为 T(n)=2T(2n)+O(1)。
这些关系式是怎么来的?我的理解是,二分查找中。每次把查找的区间缩小一半,也就是把原来的问题转换成一个一半规模的子问题,所以 T(n)=T(2n) (忽略常数时间)。而二叉树遍历中,每次递归都递归到根节点的两个子树上,每个子树的大小是原树的一半,所以相当于把原问题转换成了两个规模均为原问题一半的子问题,所以 T(n)=2T(2n) (忽略常数时间)。我理解的对吗?
- 如下图:

(来自 https://zh.wikipedia.org/wiki/主定理)
这些都是些啥玩意?我一个字都看不懂!为什么要这么做?啥是“多项式地小于”?有没有大佬回答一下?