Math 为递归函数建立和求解递归关系?

Math 为递归函数建立和求解递归关系?,math,recursion,big-o,recurrence,Math,Recursion,Big O,Recurrence,我正在学习java语言,但是我被以下问题困住了 void f(int n) { if (n<=1) return; f(n/2); System.out.writeln("still continuing..."); f(n/2); f(n/2); } void f(int n){ 如果(n让我们从T(n)值的公式开始。我们知道: 以0或1作为参数调用f需要时间O(1) 使用更大的值调用f会对f(n/2)进行三次调用,并执行恒定量的其他工作 因此,

我正在学习java语言,但是我被以下问题困住了

void f(int n) {
    if (n<=1) return;
    f(n/2);
    System.out.writeln("still continuing...");
    f(n/2);
    f(n/2);
}
void f(int n){

如果(n让我们从T(n)值的公式开始。我们知道:

  • 以0或1作为参数调用f需要时间O(1)
  • 使用更大的值调用f会对f(n/2)进行三次调用,并执行恒定量的其他工作
  • 因此,我们可以得到以下结果:

    • T(1)≤ 一,
    • T(n)≤ 3T(n/2)+1
    请注意,我在这里使用了“+1”项而不是“+O(1)”项。这在数学上是不确定的,但因为我们正在寻找一个用大O表示法表示的最终结果,所以这不会有太大的问题

    现在,我们该如何着手解决这个问题呢?一个选择是插入任意的n值,看看会发生什么

    T(n)≤ 3T(n/2)+1

    现在,让我们考虑一下对T(n/2)的调用,如果n/2>1,我们就得到了

    T(n)≤ 3T(n/2)+1

    ≤ 3(3T(n/4)+1)+1

    =9T(n/4)+3+1

    现在,让我们将其展开为一个增益:

    T(n)≤ 9吨(n/4)+3+1

    ≤ 9(3T(n/8)+3)+3+1

    =27T(n/8)+9+3+1

    在这一点上,我们可以看到一个模式正在出现。在递归的i次迭代之后,我们已经知道完成的全部工作是

    T(n)=3iT(n/2i)+和(i=0到i-1)3i

    当n/2i时,此进程终止≤ 1,当i约为lg n时发生。如果插入lg n,则

    T(n)≤ 3lg nT(1)+和(i=0到i-1)3i)

    ≤ 3lg n+总和(i=0到i-1)3lg n

    现在,3lgn=3(log3n/log32)=3log3n1/log32=n1/log32,所以整个过程是

    T(n)≤ n1/log3 2+和(i=0至(lg n)-1)3i

    使用几何级数和的公式,最后一项是(3lgn-1)/2,它最终扩展到O(n1/log3 2),所以总体上这个表达式是O(n1/log3 2)

    但这个公式真的很难看。我们能简化它吗?好吧,我们确实有这样一个:

    1/log3 2=log2 3

    这让我们知道运行时是O(nlg3),大约是O(n1.58)

    希望这有帮助

    T(n) = 3* T(n/2)+ O(1)
    
    如定理所示,答案应该是O(n^(lg3))

    有关更多详细信息,请参阅Cormen et的算法简介,参见第4章。
    递归方程的求解相当复杂。但通常方法是先猜测,然后使用替换进行证明。

    请不要滥用标记字段。您之前发布的标记与此问题无关,这是关于算法而非编程语言的问题。我用适合算法的标记替换了这些标记抱歉,我不知道用什么来填充其他4个标签,因为这只是递归。不,我从一本叫《组合优化:算法和复杂性》的书中学习,但它不是很清楚。你实际上不必全部使用5个标签。我想OP的问题是,具体地说,如何在不使用主定理的情况下解决这个问题。不是吗尽管CLRS参考资料绝对很棒!