递归与分治

来源:互联网 发布:bet数据 作图 编辑:程序博客网 时间:2024/05/17 04:53
1、递归思想:
棋盘覆盖问题:
有一个*的方格组成的棋盘,恰有一个方格是黑色的,其它为白色,需要用三个方格的L型牌覆盖所有白色方格。黑色方格不能被覆盖, 任两个方格不 能有重叠部分。L型牌如下:


解决方法:
把棋盘切为四块,则每一块都是 一个的。有黑格子的那一块可以递归解决,其他三块并没有黑格子。
循环日程表问题:
有n =2k个运动员要进行网球循环赛, 需要设计比赛日程表。每 个选手必须与其他n-1个选手各赛一次;每个选手一天只能赛一次;循环赛一共进行n-1天(只需n-1天)。
按此要求设计一张比赛日程表,它有n行和n-1列, 第i行j列为第i个选手 第j天遇到的选手。下图是k=3(n=8)的一个可行解,它是四块拼起来的。左上角是k=2的一组解,左下角是左上角每个数加4得到,而右上、右下角分别是左下、左上角复制得到。

2、两个经典的分治算法
划分(divide) 把问题划分成若干子问题(subproblem)
求解(conquer) 递归求解子问题
合并(combine) 把子问题的解合并成原问题的解

最大最小值:
给n个实数,求它们之中的最大值和最小值,要求比较次数尽量小。
解决方法:
划分:把n个数均分为两半
递归求解:求左半的最小值minL 和最大值maxL以及右半最小值minR和最大 值maxR
合并:所有数的最大值为max{maxL,maxR},最小值为min{minL,minR}

有序表查找问题:
给出从小到大排列的n个不同数a[0]~a[n-1],试判断元素x是否 出现在表中
利用二分查找


3、基于分治的排序算法和顺序统计算法
所谓排序,即把n个数从小到大 排成一行;所谓顺序统计,即给定1 <= k<= n,在n个数中找出第k大的数。
归并排序:
把序列分成两部分,对每部分递归分成两部分,然后把各部分排序,最后合并到一起,合并过程如下图:

空间复杂度为n,时间复杂度为O(n log n)
逆序对数:
给一列数a1, a2,..., an,求它的逆序对数,即有多少 个有序对i, j使得i<j但a[i] >a[j]
和上面差不多,首先不断划分,然后分别对每部分排序,但在排序的时候要记下每个数的逆序数,归并的时候,右边的数移除出时,逆序数要加上左边还没有移出的数的个数
快速排序:
快排属于原地排序,不需要额外空间
随意取一元素x,把x放到数组的尾部,也就是和尾部的元素位置互换,然后从数组左边向后开始搜索,找一个大于或等于x的元素,如A[i];从x的左边向前搜索,找一个小于x的元素,如A[j],然后把这两个元素位置互换,直到i>j,注意,当i>j时A[i]和A[j]无需交换,最后把x与A[i]元素互换,这样一轮,x的左边的所有元素都小于x,右边的所有元素都大于等于x。递归该过程。
空间复杂度为1,平均时间复杂度为O(n log n)






0 0
原创粉丝点击