计算算法的时间复杂度

时间:2015-06-29 08:24:20

标签: algorithm big-o time-complexity

如何计算函数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),但我不知道如何......

由于

2 个答案:

答案 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;
    }

we can conclude

答案 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)。