最大連續子數列和一道很經典的演算法問題,給定乙個數列,其中可能有正數也可能有負數,我們的任務是找出其中連續的乙個子數列(不允許空序列),使它們的和盡可能大。我們一起用多種方式,逐步優化解決這個問題。
例: 輸入時,答案為 20 (從a2到 a4).
演算法1:
#include
//n是陣列長度,a是待計算的陣列,放在全域性區是因為可以開很大的陣列
int n, a[1024];
int maxsumsequencesum(const
int a,int n);
int main()
int maxsumsequencesum(const
int a,int n)
return maxsum;
}
演算法2:
int maxsumsequencesum(const
int a,int n)
return maxsum;
}
演算法3:
static int maxsubsum(int a, int
left, int
right)
maxrightbordersum = 0, rightbordersum = 0;
for(i = mid + 1; i <= right; i++)
return max3(maxleftsum, maxrightsum, maxleftbordersum + maxrightbordersum);
}
演算法4:
int maxsumsequencesum(const
int a,int n)
return maxsum;
}
四種演算法的複雜度分別為o(n^3), o(n^2) , o(nlogn) , o( n);
其中演算法3採用的是」分治(divide-and-conquer)策略. 其想法是把問題分成兩個大致相等的子問題,然後遞迴的對他們求解,這是」分」部分,」治」階段將兩個子問題的解合併到一起並可能在做些少量的附加工作,最後的到問題的解;
演算法4的乙個附帶優點是:它只對資料進行一次掃瞄,一旦a[i]被讀入並處理,它就不再被記憶。因此,如果陣列在磁碟上,它就可以被順序讀入,在主存中不必儲存陣列的任何部分。不僅如此,在任意時刻,演算法都能對它已經讀出子串行問題的正確答案(其他演算法不具有這個特性), 具有這種特性的演算法叫做聯機演算法( online algorithm),僅需要常量空間並以線性時間執行的聯機演算法幾乎是完美的演算法.
資料結構與演算法分析 2 4 求最大子串行和
問題描述 給出指定整數序列,求出最大的子串行和 解決思路 方法一從i到j進行掃瞄,複雜度為o n3 方法二每次兩重迴圈,複雜度為o n2 方法三迴圈一次,複雜度為o n3 但是對輸入所有資料為負數時是不成立的 演算法實現 includeint maxseqsumofn3 int a,int n in...
資料結構 最大子串行和
最近我打算重溫一遍資料結構,於是又遇到了求最大子串行和這一基本問題。記得之前我就沒有明白透徹,這次便記錄下來。求最大子串行和,即求乙個序列中,和值最大的連續子串行。首先採用暴力解法,即求出所有的子串行和,得到最大和,這個演算法的時間複雜度是o n 2 int maxsubsum int k,int ...
資料結構與演算法 最大子串行和的實現
個人部落格 學習筆記 cs notes 最大子串行和 題目 給定 可能有負數 整數a 1 a 2 a n 求 a 1 a 2 a j 的最大值。為方便起見,若所有的整數為負數,則最大子串行和為0.也就是 在一系列整數中,找出連續的若干個整數,這若干個整數之和 最大。實現 c 語言版 函式原型為 in...