最大子串行和問題的解

2021-07-25 08:23:01 字數 1182 閱讀 1433

問題:有數n1,n2,......,ns。求乙個連續的子串行,這個序列的和最大。

這個問題有o(n^3)、o(n^2)、o(n*lgn)以及o(n)時間複雜度的解法。

下面主要說下o(n*lgn)和o(n)的解法。

1.o(n*lgn)是採用分治的思想。

前半部 後半部

4             -3              5             -2

-1            2             6             -2

最大子串行的和可能出現在三個地方:整體出現在前半部、整體出現在後半部、橫跨中間部分而佔據左右兩部分。

前半部的最大子串行和為6(從a1到a3)而後半部分的最大子串行和為8(從a6到a7)。

前半部分包含其最後乙個元素的最大和是4(從a1到a4),而後半部分包含第乙個元素的最大和為7(從元素a5到a7)。橫跨這兩部分且通過中間的和最大為4+7=11。

所以三個數的最大值為11。

**:

class solution 

int divide_conquer(const vector& arr, int s, int e)

rm = divide_conquer(arr, mid + 1, e);

rmm = arr[mid+1];

tmp = 0;

for (int i = mid+1; i <= e; ++i)

m = lm>rm ? lm : rm;

if (m < (lmm + rmm)) m = lmm + rmm;

return m;

} }};

2.o(n)的方法。

設定一變數thissum來記錄前面所有項的累和。若thissum小於0,則將其置為0,然後繼續累加,在這過程中記錄最大值。

**:

int maxsubsum(const vector& a)

return maxsum;

}

優點:

1)時間複雜度低。

2)只用對資料進行一次掃瞄,一旦a[i]被讀入並處理了,它就不需要被記憶。因此,如果陣列在磁碟上,它就可被順序讀入,在主存中不必儲存陣列。在任意時刻,演算法都能對已經讀入的資料給出子串行問題的正確答案。這種特性的演算法被稱為聯機演算法

最大子串行問題的解

最大子串行問題的解,就是求乙個陣列中,從某個位置開始到某個位置結束,這段數相加得到的和是該陣列中最大的值,求這個最大值。舉個例子 4,3,5,2,1,2,6,2這8個數的陣列中,最大的子串行的和為11,從a1到a7相加為最大值。求解這個問題有多種方法,這裡介紹三種方法來求解該問題。第一種也就是蠻力法...

最大子串行和問題

問題 給定一整數序列a1,a2,an 可能有負數 求a1 an的乙個子串行ai aj,使得ai到aj的和最大 例如 整數序列 2,11,4,13,5,2,5,3,12,9的最大子串行的和為21。對於這個問題,最簡單也是最容易想到的那就是窮舉所有子串行的方法。利用三重迴圈,依次求出所有子串行的和然後取...

最大子串行和問題

問題描述 給定乙個整數序列 可能有負數 求一子串行 記為l 使得該子串行所有元素之和最大。例 給定序列 2,11,4,13,5,2,則最大子串行和為20 11,4,13 方法一 遍歷窮舉 o n 2 略方法二 分治遞迴 o n logn 思路 將輸入序列l分為左右兩個子串行l1和l2,則l 只可能以...