這一章主要給我們介紹了分治演算法,這演算法由如下三個步驟組成
分解步驟將問題劃分為一些子問題,子問題的形式與原問題一樣,只是規模更小;
解決步驟遞迴地求解這些子問題,如果子問題的規模足夠小,則停止遞迴,直接求解;
合併步驟將子問題的解組合成原問題的解。 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...