算法分析之-最大子序列和問題

問題描述:

給定整數(shù)(可以為負數(shù)),A1勇凭,A2掂铐,A3,....,AN,求子序列最大的值

舉例:

對于整數(shù)列-1,11,-4,13,-5,-2, 最大的序列值為20 子序列為(11,-4,13)

算法1(樓主首先想到的辦法,時間復雜度為:O(n2)):

解析:遍歷此序列缩赛,取得每個小子序列的值,比較撰糠,最后得到最大的序列值,生成以下子序列并取得所有子序列和
-1
-1,11
...
-1,11辩昆,-4,13阅酪,-5,-2
11
11,-4
...
11术辐,-4,13砚尽,-5,-2
...

實現(xiàn):

public static int maxSubSum2(int [] iargs){ int sum=0; for(int i=0;i<iargs.length;i++){ int thissum=0; for(int j=i;j<iargs.length;j++){ thissum+=iargs[j]; if(thissum>sum){ sum=thissum; } } } return sum; }

算法2(算是小大招辉词,時間復雜度為O(nlogn)):

解析:在我們例子中必孤,最大的子序列可能存在三個部分,(左邊部分瑞躺、右邊部分敷搪、左邊一部分+右邊一部分),如下表所示:

左邊部分 右邊部分
-1,11,-4 13,-5,-2

左邊部分最大子序列為:11幢哨,右邊部分最大子序列為13赡勘,左邊+右邊最大子序列為20,(11,-4,13)

實現(xiàn):

public static int maxSubSum3(int[] a,int left,int right){ int sum=0; if(left==right){ sum=a[left]>0?a[left]:0; return sum; } int center=(left+right)/2; int leftMax=maxSubSum3(a,left,center); int rightMax=maxSubSum3(a,center+1,right); int maxLeftBorder=0,leftBorderSum=0; for(int i=center;i>=left;i--){ leftBorderSum+=a[i]; if(maxLeftBorder<leftBorderSum){ maxLeftBorder=leftBorderSum; } } int maxRightBorder=0,rightBordeSumr=0; for(int i=center+1;i<=right;i++){ rightBordeSumr+=a[i]; if(maxRightBorder<rightBordeSumr){ maxRightBorder=rightBordeSumr; } } return max3(leftMax,rightMax,maxLeftBorder+maxRightBorder); } public static int max3(int a,int b,int c){ int cen=a>b?a:b; return c>cen?c:cen; }

算法3(大招,時間復雜度為O(n),不看源碼想不到捞镰,修煉不夠罢⒂搿):

解析:
假設a[i]為負數(shù),則a[i]不可能為此子序列的起始岸售,同理践樱,若a[i]到a[j]的子序列為負,則a[i]到a[j]不可能為子序列的起始凸丸,則可以從a[j+1]開始推進拷邢,
實現(xiàn):

public static int maxSubSum4(int a[]){ int thisMax=0,maxSum=0; for(int i=0;i<a.length;i++){ thisMax+=a[i]; if(thisMax>maxSum){ maxSum=thisMax; } if(thisMax<0){ thisMax=0; } } return maxSum; }

算法三 只對數(shù)據(jù)進行一次掃描,一旦a[i]被讀入并處理甲雅,它就不再需要被記憶解孙。因此數(shù)組可以被按順序讀入,在主存中不必存儲數(shù)組的任何部分抛人。具有這種特性的算法叫聯(lián)機算法(on-line algorithm)弛姜,僅需要常量空間并以線性時間運行的聯(lián)機算法幾乎是完美算法!


以下為pytho版實現(xiàn)

def maxSubSum1(*a): max=0 for i,value in enumerate(a): thisMax=0 for j in a[i:]: thisMax+=j if thisMax>max : max=thisMax return max def maxSubSum2(left,right,*a): if left==right: #base case return a[left] center =(left+right)/2 maxLeft=maxSubSum2(left,center,*a) maxRight=maxSubSum2(center+1,right,*a) leftSum=0 maxLeftSum=0 i=center while i>=0: leftSum+=a[i] if leftSum>maxLeftSum: maxLeftSum=leftSum i=i-1 rightSum = 0 maxRightSum = 0 i = center+1 while i <=right : rightSum += a[i] if rightSum > maxRightSum: maxRightSum = rightSum i = i + 1 return max(maxLeft,maxRight,maxLeftSum+maxRightSum) def max(*a): max=0 for i in a: if i>max: max=i return max def maxSubSum3(*a): max=0 thisMax=0 for i in a: thisMax+=i if thisMax>max: max=thisMax if thisMax<0: thisMax=0 return max

若想取得源碼妖枚,請參看github
java版本源碼
python版本源碼

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末廷臼,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子绝页,更是在濱河造成了極大的恐慌荠商,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,110評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件续誉,死亡現(xiàn)場離奇詭異莱没,居然都是意外死亡,警方通過查閱死者的電腦和手機酷鸦,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,443評論 3 395
  • 文/潘曉璐 我一進店門饰躲,熙熙樓的掌柜王于貴愁眉苦臉地迎上來牙咏,“玉大人,你說我怎么就攤上這事嘹裂⊥” “怎么了?”我有些...
    開封第一講書人閱讀 165,474評論 0 356
  • 文/不壞的土叔 我叫張陵寄狼,是天一觀的道長丁寄。 經常有香客問我,道長泊愧,這世上最難降的妖魔是什么伊磺? 我笑而不...
    開封第一講書人閱讀 58,881評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮拼卵,結果婚禮上奢浑,老公的妹妹穿的比我還像新娘。我一直安慰自己腋腮,他們只是感情好雀彼,可當我...
    茶點故事閱讀 67,902評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著即寡,像睡著了一般徊哑。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上聪富,一...
    開封第一講書人閱讀 51,698評論 1 305
  • 那天莺丑,我揣著相機與錄音,去河邊找鬼墩蔓。 笑死梢莽,一個胖子當著我的面吹牛,可吹牛的內容都是我干的奸披。 我是一名探鬼主播昏名,決...
    沈念sama閱讀 40,418評論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼阵面!你這毒婦竟也來了轻局?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,332評論 0 276
  • 序言:老撾萬榮一對情侶失蹤样刷,失蹤者是張志新(化名)和其女友劉穎仑扑,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體置鼻,經...
    沈念sama閱讀 45,796評論 1 316
  • 正文 獨居荒郊野嶺守林人離奇死亡镇饮,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,968評論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了箕母。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片盒让。...
    茶點故事閱讀 40,110評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡梅肤,死狀恐怖司蔬,靈堂內的尸體忽然破棺而出邑茄,到底是詐尸還是另有隱情,我是刑警寧澤俊啼,帶...
    沈念sama閱讀 35,792評論 5 346
  • 正文 年R本政府宣布肺缕,位于F島的核電站,受9級特大地震影響授帕,放射性物質發(fā)生泄漏同木。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,455評論 3 331
  • 文/蒙蒙 一跛十、第九天 我趴在偏房一處隱蔽的房頂上張望彤路。 院中可真熱鬧,春花似錦芥映、人聲如沸洲尊。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,003評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽坞嘀。三九已至,卻和暖如春惊来,著一層夾襖步出監(jiān)牢的瞬間丽涩,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,130評論 1 272
  • 我被黑心中介騙來泰國打工裁蚁, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留矢渊,地道東北人。 一個月前我還...
    沈念sama閱讀 48,348評論 3 373
  • 正文 我出身青樓枉证,卻偏偏與公主長得像矮男,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子刽严,可洞房花燭夜當晚...
    茶點故事閱讀 45,047評論 2 355

推薦閱讀更多精彩內容