題目大意:給出一序列,求該序列的子序列和最大的子序列。
下面共有四種算法:程式運作時間依次降低,最佩服的是最後的聯機算法,時間已達到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)。