我正在读考试,教授给了我们一些我们没有答案的练习题。这是其中之一,但我一直在努力,甚至不知道我是否朝着正确的方向前进。我甚至都没有要求回答 - 只是有人指出我正确的方向?
我应该为以下使用expected number of acyclic orientations in a graph找到this recurrence的函数开发一个动态编程算法(O(n ^ 2))。
我认为我应该使用主定理或展开和求解来解决复发,以简化/解决重现,然后从那里开发算法?任何提示或线索将非常感激。谢谢!
答案 0 :(得分:0)
当您提供所需的两个公式时,您可以通过以下步骤找到所需内容:
<强>编辑:强>
对于要在(1+x)^i(n-i)
中为i
计算[0,n]
的第2点,虽然最大功率可以达到n ^ 2,但实际上只有{{1实例,我们不需要计算所有功率到n ^ 2。
让我们记下n
中不同i
的幂次序:0,n-1,2(n-2),3(n-3).. (N-1)(1)
我们可以像
那样预先计算它们
[0,n]
&#13;
现在,总计算它们的复杂性是多少?总结一下吧!
function repeat_squaring(base, power){
//O(lg (power))
}
for(int i=0; i<=n; i++){
repeat_squaring(1+x, i*(n-i));
}
对于T = O(lg n + lg(2n) + lg(3n) + ... lg(n*n)) = O(summation(lg(i)) + nlg(n)) = O(lg(n!) + nlgn) = O(n lg n)
的复杂性,有两种推理方法,一种是着名的斯特林近似,另一种方式是这篇文章:log(n!)
EDITED2:缩小问题
我观察O(lg(n!))
等的(1+x)^(i(N-i))
模式
您可以看到,我们可以从已经计算过的N = n, n-1, n-2
(1+x)^j
的{{1}}一词
如上所述,我们使用A_n()
来预先计算(1+x)^(i(N-i))
时的权限,我们也可以使用O(n lg n)
为{{N = n
预先计算所有O(n lg n)
1}}
现在,如图所示,对于连续(1+x)^i
值(i in [0..n]
)的术语(1+x)^(i(N-i))
,您确实可以使用N
乘以/除以某个{{1}其中n vs n-1, n-1 vs n-2 ...
(取决于您的实施,自下而上/自上而下)
所以我仍然认为你只需要O(1)
预先计算这些权力,并在需要时使用(1+x)^i
动态地将它们转换为其他权力。 (你可以认为,你同时在i in [0..n]
和O(n lgn)
进行动态编程)
<强> TL; DR 强>
当然,如果您不希望事情过于复杂,您可以使用O(1)
为所有(1+x)^(i(N-i))
A_i()
O(n^2)
单独建立一个DP
(1+x)^(i(N-i))
&#13;