您的位置:首页 > 其它

算法---分治法

2016-03-07 20:21 239 查看
1.分治法的思想:

  将一个输入规模为n的问题分解为k个规模较小的子问题,这些子问题互相独立且与原问题相同,然后递归的求解这些子问题,最后用适当的方法将各子问题的解合并成原问题的解。

2.分治法的步骤

分(divide)二分为主

治(conquer)递归调用,当规模足够小时直接处理

组(combine)

3.抽象化控制

procedureDANDC(p,q)
globaln,A(1:n);
integerm,p,q;//1≤p≤q≤n//
ifSMALL(p,q)//判断输入规模q-p+1是否足够小,可直接求解

thenreturn(G(p,q))
elsem=DIVIDE(p,q)
return(COMBINE(DANDC(p,m),DANDC(m+1,q)))
endif
endDANDC


4.解决问题

(1)二分检索(就是查找一个二分检索树)

*一定是有序的

*任何一种以比较为基础的算法,其最坏情况下的计算时间都不可能低于O(logn),也就是不可能存在其最坏情况下计算时间比二分检索算法的计算时间数量级还低的算法。结论:二分检索是解决检索问题的最优的最坏情况算法。

(2)归并分类

给定一个含有n个元素的集合,把它们按一定的次序分类(如非降次序)

(先蓝色线往下递归)



ProcedureMERGESORT(low,high)
intlow,high,mid;
if(low<high)
thenmid←(low+high)/2
callMERGESORT(low,mid)
callMERGESORT(mid+1,high)
callMERGE(low,mid,high)
endif
endMERGESORT

procedureMERGE(low,mid,high)

inth,j,k,low,mid,high;

globalA(low:high);

localB(low:high);

h←low;i←low;j←mid+1;

while(h≤midandj≤high)do

  if(A[h]≤A[j])thenB[i]←A[h];h←h+1;

  elseB[i]←A[j];j←j+1;

  endif

    i←i+1;

  repeat


if(h>mid)thenfork←jtohighdoB[i]←A[k];i←i+1repeat

elsefork←htomiddoB[i]←A[k];i←i+1repeat

fork←lowtohighdoA[k]←B[k]repeat

endMERGE



*任何以关键字比较为基础的分类算法,最坏情况下的时间下界都是Ω(nlogn),

因此从数量级的角度上看,归并算法是最坏情况下的最优算法。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: