我知道如何找到几乎任何选项的时间复杂度(简单函数,带循环的函数等),但我无法弄清楚如何确定调用另一个函数的函数的时间复杂度 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()
中包含函数调用?
答案 0 :(得分:2)
您必须考虑g
中f
的帐户复杂程度。
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)