天天看點

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html><head><meta http-equiv="Cont

題目大意:給出一序列,求該序列的子序列和最大的子序列。

下面共有四種算法:程式運作時間依次降低,最佩服的是最後的聯機算法,時間已達到O(N).

注意C++中的函數調用與傳值

下面分析四種算法:關于每種程式的運作時間,我們隻關注他的最壞情況即可。

算法一,有三個大循環,假設第一個循環的大小N,每個循環都考慮最壞的情況,則總數為 O(N),

使用開銷的思路推一下,精确分析可知,最大開銷: ∑N−1i=0∑N−1j=i∑jk=i1,該和指出此程式三次循環被執行了多少次,由内到外求值,首先我們有

∑k=ij1=j−i+1

然後我們可以得到

∑j=iN−1(j−i+1)=(N−i+1)(N−i)2

繼續:

∑i=0N−1(N−i+1)(N−i)2=∑i=1N(N−i+1)(N−i+2)2

=12∑i=1Ni2−(N+32)∑i=1Ni+12(N2+3N+2)∑i=1N1

=12N(N+1)(2N+1)6−(N+32N(N+1)2+N2+3N+22N)

=N3+3N2+2N6

是以算法一的最大消費為O(N3)。

繼續閱讀