繁体   English   中英

为递归方法确定Big O

[英]Determining Big O for a recursive method

我试图弄清楚如何为递归方法确定Big O表示法。 我意识到这可能与迭代方法相同,但是对此我不确定。

我写了这个简单的递归Java程序:

public RecursiveFunctions() {
recursiveFunction1(2);
}

// Meget simpel rekursiv metode der taeller en Integer ned 
public void recursiveFunction1(int someInteger) {
    System.out.println("Tallet er nu : " + someInteger);
    someInteger = someInteger * 2;
    if (someInteger < 100) {
        recursiveFunction1(someInteger);            
    }
}

我不确定,但是我猜这是O(n)还是O(1)表示法? 另外,O(n ^ 2)或O(log(n))包含什么?

根据您的观察方式,它是O(1),因为对于正输入它总是最多需要7次迭代,您可以说它将是O(lg n),因为所需的迭代次数将相对于lg改变输入的基数2或未定义,因为非肯定输入的计算永远不会完成。 随便你!

您必须确定基本案例的成本(函数C(n))和递归调用的成本。 例如,对于阶乘函数:

unsigned int factorial(unsigned int n)
{
    if(n < 2) //This is O(1), so not affect to the result (We could think as its a constant 'a')
        return 1; //As the comparison, think its a constant 'b', so C(0) and C(1) = b + a;
    else
        return n * factorial(n-1); //The multiplication (O(1), a constant 'c') and the call C(n-1), so C(n) = c + a + C(n-1)
}

现在,将函数C(n)扩展为一组值,以找到一个级数:

C(0) = a + b
C(1) = a + b
C(2) = (c+a) + C(1) = (c+a) + a + b
C(3) = (c+a) + C(2) = (c+a) + (c+a) + C(1) = (c+a) + (c+a) + a + b
C(4) = (c+a) + C(3) = (c+a) + (c+a) + C(2) = (c+a) + (c+a) + (c+a) + C(1) = (c+a) + (c+a) + c + a + b
C(5) = (c+a) + C(4) = (c+a) + (c+a) + C(3) = (c+a) + (c+a) + (c+a) + C(2) = (c+a)  + (c+a) + (c+a) + (c+a) + C(1) = (c+a) + (c+a) + (c+a) + (c+a) + a + b
...
C(n) = (n-1)*(c+a) + a + b --> O(n)

但是请认为,大O仅具有大n而不是数字的含义,就像您的代码中一样(您的代码至少执行了7次调用,这等效于O(1))。

通常,为递归方法寻找渐近增长可能非常复杂,但是通常可以使用Master定理解决该任务。

您的例子太简单了。 它可以很容易地转换为具有几乎同等性能的迭代函数。 然后,您可以找到迭代方法的Big-O(看起来像您知道该怎么做)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM