算法:找到分治算法的递归方程
Posted
技术标签:
【中文标题】算法:找到分治算法的递归方程【英文标题】:Algorithms: Find recursive equation of divide and conquer algorithm 【发布时间】:2017-08-19 08:02:55 【问题描述】:我有以下“分而治之”算法 A1。
A1 将 size n 的问题划分为 size n/4 的 4 个子问题。 然后,解决它们并组合12n次的解决方案。
如何编写给出算法运行时间的递归方程。
【问题讨论】:
en.wikipedia.org/wiki/Master_theorem 好的,你卡在哪里了? @PaulHankin 我编辑了我的问题 【参考方案1】:回答问题“我怎样才能写出给出算法运行时间的递归方程”
你应该这样写: 让 T(n) 表示输入大小为 n 的算法的运行时间
T(n) = 4*T(n/4) + 12*n;
【讨论】:
【参考方案2】:虽然主定理确实给出了答案的捷径,但必须了解 Big O 运行时的推导。分治递归关系写成T(n) = q * T(n/j) + cn
的形式,其中q
是子问题的数量,j
是我们为每个子问题划分数据的数量,cn
是划分/合并所需的时间/操作每个级别的每个子问题。 cn
也可以是 cn^2
或 c
,无论运行时是什么。
在您的情况下,您有 4 个大小为 n/4 的子问题,每个级别在 12n
时间内得到解决,给出的递归关系为 T(n) = 4 * T(n/4) + 12n
。从这个重复中,我们可以推导出算法的运行时间。鉴于它是分而治之的关系,我们可以假设基本情况是T(1) = 1
。
为了解决重复问题,我将使用一种称为替换的技术。我们知道T(n) = 4 * T(n/4) + 12n
,所以我们将替换T(n/4). T(n/4) = 4 * T(n/16) + 12(n/4)
。将其代入方程得到T(n) = 4 * (4 * T(n/16) + 12n/4) + 12n
,我们可以将其简化为T(n) = 4^2 * T(n/16) + 2* 12n
。同样,我们在等式中还有更多工作要做,以捕获所有级别的工作,因此我们替换 T(n/16), T(n) = 4^3 * T(n/64) + 3* 12n
。我们看到模式出现并且知道我们想要一直到我们的基本情况T(1)
,所以我们替代得到T(n) = 4^k*T(1) + k * 12n
。这个等式定义了分治算法中的工作总量,因为我们已经替换了所有级别,但是,我们仍然有一个未知变量 k,我们想要它以n
的形式得到k
通过求解方程n/4^k = 1
,我们知道我们已经达到了仅在一个变量上调用算法的地步。我们求解 n 并得到 k = log4n
。这意味着我们已经完成了log4n
替换。我们将其插入k
并获得T(n) =4^log4n*T(1) + log4n * 12n
。我们将其简化为T(n) =n *1 + log4n * 12n
。由于这是大 O 分析,由于对数基数的变化,log4n
在 O(log2n)
中,我们得到 T(n) = n + 12n * logn
,这意味着 T(n)
在 nlogn
的大 O 中。
【讨论】:
【参考方案3】:最能描述的递归关系由下式给出:
T(n)=4*T(n/4)+12*n
其中T(n)
= 给定算法对于大小为 n 的输入的运行时间,4
= 子问题的数量,n/4
= 每个子问题的大小。
使用主定理计算时间复杂度为:theta(n*log n)
【讨论】:
以上是关于算法:找到分治算法的递归方程的主要内容,如果未能解决你的问题,请参考以下文章