如何计算函数f的时间复杂度?
void f(int n)
{
if (n <= 1)
return;
g(n, n / 3);
}
void g(int n, int m)
{
int i = 1;
while (m < n) {
m += i;
i++;
}
f(n / 2);
}
答案是sqrt(n),但我不知道如何......
由于
答案 0 :(得分:4)
首先,请注意,通过在g(n,m)
中内联f()
,可以将程序现在翻译为单个功能程序:
void f(int n)
{
if (n <= 1)
return;
m = n/3;
while (m < n) {
m += i;
i++;
}
f(n / 2);
}
内部循环在O(sqrt(n))
迭代中运行,因为它从n/3
开始,以n
结束,并且增加1,2,3,...所以如果我们求和我们得到:
n/3 + (1 + 2 + ... + i) >= n
我们需要求解上面的等式来找到i
的最终值,我们得到:
1 + 2 + ... + i >= 2n/3
从算术级数的总和:
i(i+1)/2 >= 2n/3
根据上述不平等,i
确实O(sqrt(n))
位于T(n) = T(n/2) + O(sqrt(n))
^ ^
recursive step syntatic sugar for some function
which is in O(sqrt(n)).
。
因此,我们可以将复杂性表示为:
T(n) = T(n/2) + sqrt(n) = T(n/4) + sqrt(n/2) + sqrt(n) = ... =
= sqrt(1) + ... + sqrt(n/2) + sqrt(n)
现在,我们可以看到:
public static String getDesired(String desiredDateFormat, String inputFormat,String inputStringDate) {
try {
Date date = (new SimpleDateFormat(inputFormat)).parse(inputStringDate);
return (new SimpleDateFormat(desiredDateFormat)).format(date);
} catch (ParseException e) {
e.printStackTrace();
}
return null;
}
答案 1 :(得分:0)
设F n 为f(n)
和G n的时间复杂度,m 为g(n,m)
的时间复杂度。
G n,m = sqrt(n-m)+ F n / 2
F n = G n,n / 3 = sqrt(nn / 3)+ F n / 2 = C sqrt(n )+ F n / 2
所以答案是sqrt(n)。