算法:找到分治算法的递归方程

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^2c,无论运行时是什么。

在您的情况下,您有 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 分析,由于对数基数的变化,log4nO(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)

【讨论】:

以上是关于算法:找到分治算法的递归方程的主要内容,如果未能解决你的问题,请参考以下文章

算法分析之递归与分治策略

2.3.2 分析分治算法

分治算法数组中的最大个数

算法分析三:分治策略

递归分治算法-归并排序算法

硬件递归分治算法