如何确定递归代码的Big-O?

时间:2016-06-16 15:58:18

标签: c++ recursion big-o

我有以下代码,这是对这个问题的回答:https://leetcode.com/problems/add-digits/

class Solution {
public:
    int addDigits(int num) {
        if (!num/10)
            return num;

        long d = 1;
        int retVal = 0;

        while(num / d){
            d *= 10;
        }
        for(d; d >= 1; d/=10){
            retVal += num / d;
            num %= d;
        }
        if (retVal > 9)
            retVal = addDigits(retVal);

        return retVal;
    }
};

作为对此的后续行动,我正在尝试确定BigO的增长情况。我计算它的第一次尝试是O(n^n)(我假设每个深度的增长直接取决于n每次),这只是令人沮丧。我错了吗?我希望我错了。

3 个答案:

答案 0 :(得分:2)

在这种情况下,它是线性O(n),因为你在没有任何循环的情况下递归调用addDigits方法,并且在方法体中没有一次

更多细节: Determining complexity for recursive functions (Big O notation)

<强>更新: 从递归函数被调用一次的观点来看,它是线性的。但是,在这种情况下,它并不完全正确,因为执行次数几乎不依赖于输入参数。

答案 1 :(得分:2)

nnum的基数10中的位数。 我说那个

  

T(1)= O(1)

     

T(n)= n + T(n&#39;),n&#39; &LT; = N

这给了我们

  

O(N * N)

但我们可以做得更好吗? 请注意,2位数字可表示的最大数量为99,以这种方式减少99 - &gt; 18 - &gt; 9

请注意,我们始终可以将10位数字折叠为2 9999999999->90。对于n>10,我们可以分解最多10位数的n/10段中的数字,并将每个2位数的段数减少以进行求和。 n/10个2位数的总和将始终小于(或等于)(n/10)*2个数字。因此

  

T(n)= n + T(n / 5),n> = 10

n&lt; 10的其他基本情况应该更容易。这给了

  对于n <10,T(n)= O(1)      

T(n)= n + T(n / 5),n> = 10

求解递推方程给出

  

O(n)对于n> = 10

答案 2 :(得分:1)

对于值{&lt; {1}}看起来像O(1) 10,O(n)用于任何其他值。

我对Big-O符号不够精通,无法回答如何将其结合起来。

最有可能的第一部分在重要性上是可识别的,总体时间复杂度变为O(n)