2011-09-19 37 views
3

因此,對於作業,我們必須計算一段代碼中的步數。那就是:基本算法分析和求和符號

int sum = 0; 
for (int i = 1; i <= n*n; i++) 
    for (int j = 1; j <= i; j++) 
     for (int k = 1; k <= 6; k++) 
      sum++; 

我的教授(我認爲)解釋說,在2號線的操作次數可以發現使用求和符號,就像這樣:

n^2 
Σ x 4 + 3 
i=1 

這將是1/2 (n^4 + n^2)x 4 + 3 = 2n^4 + 2n^2 + 3

但是隻看線,我會認爲它會像4n^4 + 2說4n^4 + 3,我不確定第三次手術在哪裏......)

我在這裏做總結符號錯誤嗎?對我來說,爲嵌套for循環做求和表示法是有道理的,但我不知道它爲什麼會爲for循環本身起作用。

謝謝。

回答

-1

你需要計算這是什麼:

S = sum(i in 1..n^2) sum(j in 1..i) sum(k in 1..6) 1 

現在,最裏面的總和顯然是6,所以我們有

S = sum(i in 1..n^2) sum(j in 1..i) 6 
    = 6 sum(i in 1..n^2) sum(j in 1..i) 1 

最裏面的總和是第i個數字的簡單相加,你應該知道的是i(i + 1)/2,讓

S = 6 sum(i in 1..n^2) i(i + 1)/2 
    = 3 sum(i in 1..n^2) i(i + 1) 
    = 3 sum(i in 1..n^2) (i^2 + i) 

我們可以分開處理成兩個總和:

S = 3 [ (sum(i in 1..n^2) i^2) + (sum(i in 1..n^2) i) ] 

第二個總和就是我們的老朋友,第一個n^2數字的總和,所以擴展很容易。

第一筆總額有一個新的朋友,第n + 2個廣場的總和。如果你不知道它,你可以谷歌。

放下公式,用掃帚展開一點,整齊一點,你應該得到你的答案。

乾杯!

+0

錯誤的是,當你計算中間循環的結果時,你說它是'i(i + 1)/ 2',而它只是'i',因爲它不是第一個'i'數的總和, '''爲'我'次。 – Saphrosit

+0

@Saphrosit:你說得很對,我糾正了。 – Rafe

8

其實你的教授結果是錯誤的。確切的結果是3n^4+3n^2

爲了獲得這一結果簡單地認爲:

enter image description here

所有通道都非常簡單(步驟4的通道到第5步是立即的,如果你考慮的配方爲首創n自然數的總和)。

1

我想你和你的教授都是錯的。根據我的計算(我可能也是錯的),應該是3n^4+3n^2

最外層循環將運行n^2次。考慮到這一點,內循環將在第一次迭代中運行1次,依此類推直到n^2。即從j=1 to j=1,2,3,4 ... n^2。如果我們總結(1+2+3...n^2)這個系列,那麼這將變成(n^2(n^2+1))/2

因此,對於外部循環的n^2次迭代,內部循環將執行(n^2(n^2+1))/2次。對於第二個循環的每次迭代,最內部的循環執行六次。所以通過將(n^2(n^2+1))/2乘以6就可以得到3n^4+3n^2

要檢查答案讓我們舉個例子。說n=5,運行你的算法,並打印總和這將給1950年。現在替換這個值在評估表達式,這將像3(5^4)+3(5^2),並再次這個評估爲1950