这段代码的Big-O是什么?

时间:2017-03-11 18:30:38

标签: c time-complexity big-o

最近我参加了一个考试,问题是:g的时间复杂度是多少?

int f(int *arr, int n, int m)
{
    if(n == 0)
    {
        if(m == 0)
            return 3;

        return arr[m] + f(arr, n, m - 1);
    }

    return f(arr, n - 1, m);
}

int g(int *arr, int n)
{
    return f(arr, n, n);
}

现在,我和我的大多数朋友都回答了O(n),因为有明显的2 * n要求f而没有别的,但教授的回答是O(n ^ 2)。 谁能向我解释谁是对的?如果是他,你能解释一下原因吗?

1 个答案:

答案 0 :(得分:2)

修改

在帖子中,我意识到我正在解决错误的问题。当内部函数调用是f(arr, m, m - 1)时,我正在解决。在这种情况下,时间复杂度确实是O(n²)。问题的发布方式,时间复杂度为O(n)。但是,我会留下这篇文章,因为这很可能是教授误以为的方式。因此,以下答案是以考试问题可能参考的方式编写的。

考虑采取的步骤:

  1. 递归调用f() n次,意味着n == 0 n调用堆栈。
  2. 现在,在这个最低功能调用中,我们可以输入if语句。
  3. 我们再次调用f(),减少m,但是通过调用m作为第二个参数来维持原始的n值。
  4. 在这个'新'递归堆栈中,我们必须先再次调用f() n(或m)次才能再次将m减少1。
  5. 一旦m == 0,我们就可以返回。
  6. 查看此图表,其中每个“单位”代表对f()的一次调用。当n == 0时,我们再次使用第三个参数调用并将m减少1,因此我们下降一个级别。 A graph of n and m values

    由于此图表中矩形的区域为n * mm == n,这意味着f()被称为次,代码的时间为O(n²)复杂性。