[英]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
從上面的不等式, 我們可以得出結論 ,確實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)
令F n為f(n)
的時間復雜度,而G n,m為g(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.