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

时间:2016-06-30 21:07:07

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

我知道如何找到几乎任何选项的时间复杂度(简单函数,带循环的函数等),但我无法弄清楚如何确定调用另一个函数的函数的时间复杂度 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()中包含函数调用?

4 个答案:

答案 0 :(得分:2)

您必须考虑gf的帐户复杂程度。

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

因此f的复杂性是这些复杂性log(j)的总和。

最糟糕的是O(n²log(n))

答案 1 :(得分:2)

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

在你的情况下,f的复杂性是O(n 2 )&amp; g的复杂度为O(lg(n)),总体复杂度为O(n 2 lg(n))

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

这是直观的n²log(n),但更确切地说,你会得到以下证据:

enter image description here

enter image description here