分治策略
分治策略( Divide and Conquer )
1、将原始问题划分或者归结为规模较小的子问题
2、递归或迭代求解每个子问题(独立求解)
3、将子问题的解综合得到原问题的解
注意:
1.子问题与原始问题性质完全一样
2.子问题之间可彼此独立地求解
3.递归停止时子问题可直接求解(子问题足够小,可以有直接的求解算法)
检查x在数组T中是否出现
算法Binary Search (T, l,r, x)
输入:数组T,下标从l到r;数x
输出: j //若x在T中,j 为下标;否则为0
1. l←1; r←n
2. while l <= r do
3. m←[ (l +r)/2] // m为中间位置,如果xx then r←m-1 //如果x比m小,转为前半个数组,归结成规模减半的子问题
6. else I←m+1 //否则就是x比m大,转为后半个数组,也归结成规模减半的子问题
7. return 0
二分检索算法设计思想
●通过x与中位数的比较,将原问题归结为规模减半的子问题,如果x小于中位数,则子问题由小于x的数构成,否则子问题由大于x的数构成.,
●对子问题进行二分检索.
●当子问题规模为1时,直接比较x与T[m],若相等则返回m,否则返回0. (这就是对规模最小的问题直接求解)
二分检索时间复杂度分析
二分检索问题最坏情况下时间复杂度
递推方程:W(n)= W( [n/2] )+1 //问题规模是n,即数组大小是n时,经过一次比较(即+1,这是一次比较的工作量),归结成规模不超过2/n的一个子问题
初值:W(1)= 1
可以解出
W(n)= [ logn ]+ 1
算法Merge Sort (A,p, r)
输入:数组A[p…r]
输出:元素按从小到大排序的数组A
1. if p
二分归并排序设计思想
● 划分将原问题归结为规模为n/2的两个子问题
● 继续划分,将原问题归结为规模为n/4的4个子问题.继续…,当子问题规模为1时,划分结束.
●从规模1到n/2,陆续归并被排好序的两个子数组.每归并一次,数组规模扩大一倍,直到原始数组。
二分归并排序时间复杂度分析
假设n为2的幂,二分归并排序最坏情况下时间复杂度
W(n)= 2W(n/2) +n-1 //2W(n/2)是两个子问题的工作量,n-1
初值:W(1)=0 // 规模是1的工作量是0次比较
可以解出
W(n)= nlogn-n+ 1
算法Hanoi (A,C,n) // n个盘子A到C
1. ifn=1 then move (A,C) //1个盘子A到C
2. else Hanoi (A, B, n-1) //把n-1个盘子从A移到B
3. move (A, C) //上一步移好了之后直接把剩下的那个(最大的盘子)从A移到C
4. Hanoi (B, C,n-1) //把B上n-1个盘子移到C
//把n个盘子的移动问题转为n-1个盘子的移动问题
设n个盘子的移动次数为T(n)
T(n)= 2 T(n-1)+ 1, //两个子问题的工作量:2 T(n-1),+1代表3.的一个盘子从A移到C移动一次
初值:T(1)= 1,
解:T(n)=2n-1
算法设计思想
●将原问题归结为规模为n-1的2个子问题.
●继续归约,将原问题归结为规模为n-2的4个子问题.继续…,当子问题规模为1时,归约过程截止.
●从规模1到n-1,陆续组合两个子问
题的解。直到规模为n.
小结
●将原问题归约为规模小的子问题,
子问题与原问题具有相同的性质.
●子问题规模足够小时可直接求解.
●算法可以递归也可以迭代实现.
●算法的分析方法:递推方程.