第4章 分治策略 最大字陣列問題

2021-07-11 22:19:42 字數 2133 閱讀 2820

這一章主要給我們介紹了分治演算法,這演算法由如下三個步驟組成

分解步驟將問題劃分為一些子問題,子問題的形式與原問題一樣,只是規模更小;

解決步驟遞迴地求解這些子問題,如果子問題的規模足夠小,則停止遞迴,直接求解;

合併步驟將子問題的解組合成原問題的解。 t

(n)=

at(n

/b)+

f(n)

(a>=1,

b>1)

當我們碰到這樣的遞迴式時,大部分的時候求解結果可跟如下四種情況對應:

若對某個常數

ε>

0 , 有 f(

n)=o

(nlo

gba−

ε)(多項式小於),則 t(

n)=θ

(nlo

gba)

。若 f

(n)=

θ(nl

ogba

) , 則 t(

n)=θ

(nlo

gbal

gn) 。若 f

(n)=

θ(nl

ogba

lgkn

)(k≥

0),則 t(

n)=θ

(nlo

gbal

gk+1

n)若對某個常數

ε>

0 , 有 f(

n)=ω

(nlo

gba+

ε)(多項式大於),並且對某個常數

c<

1 和所有足夠大的n有 af

(n/b

)≤cf

(n) , 則 t(

n)=θ

(f(n

))。其實這種情況滿足第二個條件即可,第二個條件可以推出第乙個條件,可以用歸納假設證明。

這一章給我們介紹了分治演算法的兩個應用,最大字陣列問題和矩陣相乘問題。下面給出**。

求解最大子陣列問題有四種方法,時間複雜度分別為 o(

n3) , o(

n2) , o(

nlgn

) ,o(

n)。 分治演算法對應的複雜度為o(

nlgn

) 。

~~~c++

#include

using namespace std;

templatetype maxsubarraysum(const vector& array)

} return maxsum; }

~~~c++

#includeusing namespace std;

templatetype maxsubarraysum(const vector& array)

}return maxsum;

~~~c++

#include using namespace std;

templatetype max3(type i,type j,type k)

template

type maxsubarraysumrec(const vector& array,long left,long right)

type maxrightbordersum=type(),rightbordersum=type();

for(long i=center+1;i<=right;++i)

// 將這些子問題的解合併。

return max3(maxleftsum,maxrightsum,maxleftbordersum+maxrightbordersum);

templatetype maxsubarraysum(const vector& array)

~~~c++

#include using namespce std;

templatetype maxsubarraysum(const vector& array)

return maxsum;

最大子陣列問題(第4章 分治策略)

求子陣列的最大和 題目描述 輸入乙個整形陣列,陣列裡有正數也有負數。陣列中連續的乙個或多個整數組成乙個子陣列,每個子陣列都有乙個和。求所有子陣列的和的最大值。要求時間複雜度為o n 例如輸入的陣列為1,2,3,10,4,7,2,5,和最大的子陣列為3,10,4,7,2,因此輸出為該子陣列的和18。思...

分治策略之最大子陣列問題

問題 乙個整數陣列中的元素有正有負,在該陣列中找出乙個連續子陣列,要求該連續子陣列中各元素的和最大,這個連續子陣列便被稱作最大連續子陣列。比如陣列的最大連續子陣列為,最大連續子陣列的和為5 2 1 2 8。一 暴力解法 include using namespace std class soluti...

分治策略之最大子陣列問題

最大子陣列,即子陣列中的各個元素相加的和是所有子陣列中最大的。假設最大子陣列為 ai.aj 則必然是以下三種情況 1 完全位於子陣列a low.mid 中 2 完全位於子陣列a mid 1.high 中 3 跨越了中點low i mid j high 如果暴力求解的話,時間複雜度為 n int fi...