簡體   English   中英

確定該程序的時間復雜度

[英]Determining the time complexity of this program

void f2(int n)
{
    if (n<=1)
        return;
        g2(n, n/3);
}
void g2(int n, int m)
{
    int i=1;
    while (m < n) {
        m += i;
        i++;
    }
    f2(n/2);
}

我嘗試了很多計算時間復雜度並弄錯了,如果有人可以幫助我了解如何處理這些程序,我將不勝感激。 (答案是O(sqrt(n) )。

下面的解釋可以簡化,但我盡量做到一絲不苟。

算術級數之和

首先讓我們談談以下循環的復雜性(注意m=0 ):

int m=0;
int i=1;
while (m < n) {
    m += i;
    i++;
}

循環的不變量是:在第i次迭代后m == 1+2+...+i == (1+i)*i/2 所以當滿足以下條件時循環停止:

i(i-1)/2 < n <= (i+1)i/2

這相當於

sqrt(i(i-1)/2) < sqrt(n) <= sqrt((i+1)i/2)

左右部分的大 O 相等且都等於O(i) ,所以O(i)=O(sqrt(n))是循環的復雜度。

g2內部循環的復雜度

g2內部的循環等價於以下循環:

int n_modified = n - m;
m = 0;
int i=1;
while (m < n_modified) {
    m += i;
    i++;
}

正如我們在上一節中展示的那樣,復雜度是O(sqrt(nm))

f2 的復雜性

現在讓我們得到f2 function 復雜度的總體公式。 它的復雜度與g2(n, n/3)調用的復雜度基本相同。 它由兩部分組成: g2循環的復雜性和遞歸的復雜性。 也就是說,公式是

f2 的復雜度

這可以簡化和估計(幾何級數的分解和總和):

因式分解、估計、幾何級數的總和

這給了我們最終的答案: f2的復雜度是O(sqrt(n))

暫無
暫無

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

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