分治法概念:
分治法:将原问题分成n个规模较小而结构与原问题相似的子问题;递归地解这些子问题,然后合并其结果就得到原问题的解。
分治模式在每一层递归上都有三个步骤:
第一步:将原问题分解成一系列子问题;(分解)
第二部:递归地解各子问题。若子问题足够小,则直接求解;(解决)
第三部:将子问题的结果合并成原问题的解;(合并)
分治法算法分析:
当一个算法中含有对自身的递归调用时,其运行时间可用一个递归方程来表述,分治算法中的递归式是基于基本模式中的三个步骤的。设T(n)为在规模n下问题的运行时间。如果n足够小,例如有n<c(c为常量),则得到它的直径解的时间为常量,写作theta(1)。假设我们把原问题分成a个子问题,每一个的大小是原问题的1/b。若分解该问题和合并解的时间各为D(n),则得递归式:
theta(1) 若n<=c
T(n)={
aT(n/b)+D(n)+C(n) 否则
合并排序算法的分析:
合并算法是分治法的一种,故基本步骤如下:
分解:这一步仅仅是计算出子数组中间位置,因而D(n)=theta(1)
解决:递归地解两个规模为n/2的子问题,时间为2T(n/2)
合并:已知merge过程在一个含有n个元素的子数组上的运行时间为theta(n)。则C(n)=theta(n).
函数D(n)和C(n)的阶为theta(n)和theta(1),他们的和是n的线性函数,即阶为theta(n)。将它与“解决”步骤所得的项2T(n/2),即得T(n)的递归表示:
theta(1) 若n=1
T(n)={
2T(n/2)+theta(n) 若n>1
递归式解法:
本来打算详细讲解的,但是由于时间有限,直接在网上找到一份ppt上传吧,基本上能讲清楚,而且PPT格式比网页看起来更友好些,各位看官见谅