2017-05-30 87 views
0

我正在做一些介紹性的算法分析實踐問題,在它的某些方面仍然有點不穩定。我已經對下面的練習拍了一下,但沒有答案。評論是我自己的工作。我想知道在這方面有經驗的人是否願意看看我的嘗試,並讓我知道我是否正確接近它。任何幫助表示讚賞!Big-Theta算法分析


「將下面的僞代碼的漸近最差情況運行時間作爲Big-Theta表達式。」

procedure Sum(n) 
    S ← 0 //1 for assignment 
    k ← n //1 for assignment 
    while k ≥ 1 do //O(log n) 
     for i = 1, 2, . . . , n do //n*O(log n) 
      S ← S + n //(1 for assignment + 1 for addition)*n*O(log n) 
     end for 
     k ← k/2 //1 for division + 1 for assignment 
    end while 
    return S //1 for return 
end procedure 

//合計爲1 + 1 + O(log n)的+ N O(log n)的+ 2N O(log n)的+ 2 + 1 =

// 5 +( 3N + 1)* O(log n)的=

//Θ[(3N + 1)日誌n]的

+1

看起來不錯,但結果可以簡化爲'Theta(n log n)',因爲常數因子和低階項並不重要。 – Henry

回答

1

總體而言,該方法是很好的,以及作爲最終結果,但也有一些小的可以糾正的方面:

  • 因爲您對Big-Theta類感興趣,所以最好從頭開始使用它。這會阻止從Big-O到Big-Theta的最終轉換,即,執行5+(3n + 1)* O(log n)=Θ[(3n + 1)log n]的步驟,這不是一般來說是真的。

  • k ← k/2 //1 for division + 1 for assignment位於​​循環內部,因此在考慮整體複雜度時應該乘以log(n)。儘管如此,最終的結果仍然是正確的,因爲複雜性主要取決於在最內層循環中完成的工作。

+0

在這種情況下,我將如何避免在對數複雜度的步驟中使用Big-O? – MMMMMCK

+0

@MMMMMCK代碼註釋中標記爲O(log(n))的循環也是Θ(log(n)),因爲這裏有近似log(n)的迭代,所以這個log(n)邊界是緊的(_e .g._作爲更詳細的證明,我們有0.5 * log(n)<迭代次數<2 * log(n),證明它在Θ(log(n))類中)。 – qwertyman

+0

@MMMMMCK同樣,你在代碼註釋中標出的所有邊界都是緊密的,所以可以從每個O(f(n))開始爲每個O(f(n))代替每個O(f(n)),然後繼續theta符號直到結束,現在不需要在O和Θ之間進行轉換。 – qwertyman