【问题标题】:Time complexity of function calling another function?函数调用另一个函数的时间复杂度?
【发布时间】:2016-11-03 03:36:42
【问题描述】:

我知道如何计算几乎所有选项(简单函数、带循环的函数等)的时间复杂度,但我不知道如何确定调用 另一个函数的时间复杂度 em> 函数,特别是如果调用函数在循环中。

我写了一些函数,作为例子。

int g(int k) {
  int i=0;

  while(k>0) {
    i += k;
    k= k/2;
  }

  return i;
}

int f(int n) {
  int m = 0;

  for (int i=0; i<n; ++i) {
    for (int j=i; j<n; ++j) {
      m += g(j);
    }
  }

  return m;
}

我想不通:我是否必须考虑函数g()的时间复杂度,如果我必须在函数f()中计算它?还是我只是忽略函数g(),只在函数f() 中包含函数调用?

【问题讨论】:

    标签: c++ time-complexity big-o asymptotic-complexity


    【解决方案1】:

    这直观上是 n²log(n),但更准确地说,你会得到以下证明:

    【讨论】:

      【解决方案2】:

      为了求出 f 的复杂度,只需将 g 的代码内联到 f 中,就好像这是一个完整的函数。调用本身是O(1),因此对复杂度没有影响,就好像g里面的代码是在调用g的地方执行的一样。

      在某些情况下这是不正确的,例如,如果您将一个大小为 n 的数组作为参数传递给函数:在这种情况下,数组副本本身将是 O(n),因此调用将对复杂性有一些影响。

      【讨论】:

        【解决方案3】:

        因为,函数 g 的复杂度取决于参数 k(对数),所以在从函数 f 调用它时必须考虑它。如果 g 的最坏情况操作具有恒定的时间复杂度,那么您可能不需要明确考虑它。

        在您的情况下,f 的复杂度为 O(n2),而 g 的复杂度为 O(lg(n)),总体复杂度为 O(n2 lg(n))

        【讨论】:

        • f 的复杂度为 O(n^2 ln(n)) 如果 g 具有恒定复杂度,则为 O(n^2)
        • 同意tobi303,如果函数g的复杂度恒定,那么整体复杂度为O(n^2)。
        • 那为什么要写“f的复杂度是O(n^2)”呢?这是误导。
        【解决方案4】:

        您必须考虑gf 中的复杂性。

        g 具有 O(log(n)) 复杂性。

        所以f 的复杂度是log(j)s 复杂度的总和。

        最坏的情况是O(n²log(n))

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-10-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多