簡體   English   中英

計算算法的時間復雜度

[英]Calculating time complexity of algorithm

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

謝謝

首先,請注意,現在可以通過在f()內聯g(n,m)將該程序轉換為單個函數程序:

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

從上面的不等式, 我們可以得出結論 ,確實iO(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)

上面的總和是O(sqrt(n))

令F nf(n)的時間復雜度,而G n,mg(n,m)的時間復雜度。

G n,m = sqrt(nm)+ F n / 2

F n = G n,n / 3 = sqrt(nn / 3)+ F n / 2 = C sqrt(n)+ F n / 2

因此答案是sqrt(n)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM