关于主定理的疑问
  • 板块学术版
  • 楼主DengStar
  • 当前回复8
  • 已保存回复8
  • 发布时间2022/9/17 22:50
  • 上次更新2023/10/27 11:04:56
查看原帖
关于主定理的疑问
470769
DengStar楼主2022/9/17 22:50

萌新刚学 OI,在网上看了 114514 篇介绍主定理的文章,感觉都太过抽象。它们都说主定理是用来求时间复杂度的,但是它们都没有给出一个具体的例子演示它到底是怎么运作的!这无疑对新人很不友好。
我在研究了维基百科的这个条目很久以后,得出了一些我的理解,但是我不知道它们是否正确,希望大佬们指正。我对主定理还有许多疑问,希望大佬们也回答一下。


  1. 我的理解:主定理只能用于求递归或分治算法的时间复杂度。例如二分查找,它是一个分治的算法,因此可以用主定理来计算它的时间复杂度。而冒泡排序不是一个递归或分治的算法,因此不能用主定理来计算。
  2. 用于主定理计算的递归关系式究竟是怎么来的?
    根据维基百科:
    “假设有递推关系式 T(n)=aT(nb)+f(n)T(n)=aT(\frac{n}{b})+f(n),其中 nn 为问题规模,aa 为递归的子问题数量,nb\frac{n}{b} 为每个子问题的规模(假设每个子问题的规模基本一样),f(n)f(n) 为递归以外进行的计算工作……”
    维基百科还给出了几个算法的递推关系式,例如二分查找的递推关系式为 T(n)=T(n2)+O(1)T(n)=T(\frac{n}{2})+O(1),二叉树遍历的递推关系式为 T(n)=2T(n2)+O(1)T(n)=2T(\frac{n}{2})+O(1)
    这些关系式是怎么来的?我的理解是,二分查找中。每次把查找的区间缩小一半,也就是把原来的问题转换成一个一半规模的子问题,所以 T(n)=T(n2)T(n)=T(\frac{n}{2}) (忽略常数时间)。而二叉树遍历中,每次递归都递归到根节点的两个子树上,每个子树的大小是原树的一半,所以相当于把原问题转换成了两个规模均为原问题一半的子问题,所以 T(n)=2T(n2)T(n)=2T(\frac{n}{2}) (忽略常数时间)。我理解的对吗?
  3. 如下图:
    (来自 https://zh.wikipedia.org/wiki/主定理)
    这些都是些啥玩意?我一个字都看不懂!为什么要这么做?啥是“多项式地小于”?有没有大佬回答一下?
2022/9/17 22:50
加载中...