分治算法应用的条件:
大问题可以分成更容易解决的子问题 子问题的结构与大问题有相同的结构即最优子结构性质 子问题的解合成了大问题的解 子问题之间是相互独立的
divide-and-conquer(P)
{
if ( | P| <= n0){y=adhoc(P);,return y;} //解决小规模的问题
else{
divide P intosmallersubinstancesP1,P2,...,Pk;//分解问题
for (i=1,i<=k,i++)
yi=divide-and-conquer(Pi); //递归的解各子问题
returnmerge(y1,...,yk); //将各子问题的解合并为原问题的解
}
}
据此容易设计出二分搜索算法:
template<classType>
intBinarySearch(Typea[], const Type& x,int l, int r)
{
while (r >= l){
int m = (l+r)/2;
if (x == a[m]) return m;
if (x < a[m]) r = m-1; else l = m+1;
}
return -1;
}