函数调用另一个函数的时间复杂度?

Time complexity of function calling another function?

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

我写了一些函数,用作示例。

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() 中的函数调用?

您必须考虑 fg 的复杂性。

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

所以 f 的复杂性是这些复杂性 log(j) 的总和。

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

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

在你的例子中,f 的复杂度是 O(n2) & g 的复杂度是 O(lg(n)),产生 O(n[=14) 的整体复杂度=]2lg(n))

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

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

这在直觉上是 n²log(n),但更准确地说,您得到以下证明: