开发一种求和递归的动态规划算法

时间:2016-03-10 16:50:14

标签: algorithm dynamic graph recurrence

我正在读考试,教授给了我们一些我们没有答案的练习题。这是其中之一,但我一直在努力,甚至不知道我是否朝着正确的方向前进。我甚至都没有要求回答 - 只是有人指出我正确的方向?

我应该为以下使用expected number of acyclic orientations in a graph找到this recurrence的函数开发一个动态编程算法(O(n ^ 2))。

我认为我应该使用主定理或展开和求解来解决复发,以简化/解决重现,然后从那里开发算法?任何提示或线索将非常感激。谢谢!

1 个答案:

答案 0 :(得分:0)

当您提供所需的两个公式时,您可以通过以下步骤找到所需内容:

  1. 使用O(n ^ 2)预先计算nCr(尽可能大的n)
  2. 使用重复平方法预先计算(1 + x)^ n(我想你知道x的域?所以对于所有n来说它是O(n lgn)
  3. 使用那些预先计算的值计算A_n(X),你有至多O(n)个子问题要计算,每个使用O(n)给出O(n ^ 2)
  4. <强>编辑:

    对于要在(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)

    我们可以像

    那样预先计算它们

    &#13;
    &#13;
    [0,n]
    &#13;
    &#13;
    &#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:缩小问题

    enter image description here

    我观察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

    &#13;
    &#13;
    (1+x)^(i(N-i))
    &#13;
    &#13;
    &#13;