我有以下"分而治之?"算法A1。
A1将 size n 的问题划分为 size n / 4 的4个子问题。 然后,解决它们并将解决方案组合成 12n时间。
如何编写给出算法运行时的递归方程。
答案 0 :(得分:1)
回答问题"我如何编写给出算法运行时的递归方程"
你应该这样写: 设T(n)表示算法的输入大小为n
的运行时间T(n)= 4 * T(n / 4)+ 12 * n;
答案 1 :(得分:1)
尽管主定理确实给出了答案的捷径,但必须了解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
。由于这是Big O分析,并且由于对数的基本属性的变化,log4n
在O(log2n)
中,因此我们得到T(n) = n + 12n * logn
,这意味着T(n)
在Big O中的nlogn
。
答案 2 :(得分:0)
最佳描述的递归关系由下式给出:
T(n)=4*T(n/4)+12*n
其中T(n)
=给定算法的运行时间,输入大小为n,4
=无子问题,n/4
=每个子问题的大小。
使用主定理时间复杂度计算为:theta(n*log n)