递归与分治策略思维导图

二分搜索:

将n个元素分成个数大致相同的两半,取a[n/2]与x作比较。如果x=a[n/2],则找到x,算法终止;如果x<a[n/2],则只在数组a的左半部继续搜索x;如果x>a[n/2],则只在数组a的右半部继续搜索x。二分搜索技术充分利用了元素间的次序关系,采用分治策略,可最坏用O ( l o g n ) O(logn)O(logn)时间完成搜索任务。

大整数算法:

分解:

首先将2个大整数a(n位)、b(m位)分解为两部分:ah和al、bh和bl

ah表示大整数a的高位,al表示大整数a的低位,,ah、al为n/2位。

bh表示大整数b的高位,bl表示大整数b的低位,,bh、bl为m/2位。

2个大整数a(n位)、b(m位)相乘转换成了4个乘法运算ah*bh、ah*bl、al*bh、al*bl,而乘数的位数变为了原来的一半。

求解子问题:继续分解两个乘法运算,直到分解有一个乘数位1位数时停止分解,进行乘法运算并记录结果。

合并:将计算出的结果相加并回溯,求出最终结果。

Strassen矩阵乘法:

  使用分治法,将一个矩阵转换为子矩阵相乘的方式。矩阵乘法耗费时间要比矩阵加法耗费的时间多,想要改进矩阵乘法的计算时间复杂性,必须减少乘法运算。Strassen矩阵乘法用了7次对于n/2阶矩阵乘积的递归调用和18次n/2阶矩阵的加减运算。

棋盘覆盖:

(1)棋盘:可以用一个二维数组board[size][size]表示一个棋盘,其中,size=2^k。为了在递归处理的过程中使用同一个棋盘,将数组board设为全局变量;
(2)子棋盘:整个棋盘用二维数组board[size][size]表示,其中的子棋盘由棋盘左上角的下标tr、tc和棋盘大小s表示;
(3)特殊方格:用board[dr][dc]表示特殊方格,dr和dc是该特殊方格在二维数组board中的下标;
(4) L型骨牌:一个2k×2k的棋盘中有一个特殊方格,所以,用到L型骨牌的个数为(4^k-1)/3,将所有L型骨牌从1开始连续编号,用一个全局变量t表示。
设全局变量t已初始化为0

合并排序和快速排序:

合并:

(1)分解:将n个元素分成个含n/2个元素的子序列。
(2)解决:用合并排序法对两个子序列递归排序。
(3)合并:合并两个已排序的子序列已得到排序结果

快速排序:

(1)选择基准:在待排序列中,按照某种方式挑出一个元素,作为 “基准”(pivot)
(2)分割操作:以该基准在序列中的实际位置,把序列分成两个子序列。此时,在基准左边的元素都比该基准小,在基准右边的元素都比基准大
(3)递归处理:递归地对两个序列进行快速排序,直到序列为空或者只有一个元素。

线性时间选择算法(又称顺序统计算法):
将n个元素划分成⌈ n / 5 ⌉ \lceil n/5 \rceil⌈n/5⌉组,每组5个元素,至多只有一组包含n mod 5个元素
通过每组排序,找出每组的中位数构成序列M
取序列M的中位数x(若序列有偶数,取两个中位数中较大者)
用x作为基准元素,对原n个元素进行划分,i为分裂点
若k<=j,则用前部分子问题递归求第k小元素;
若k>j,则用后部分子问题求第k-i小元素
j为前部分子问题元素的个数。

最接近点对问题:

将所给的平面上n个点的集合S分为两个子集S1和S2(可以按照x坐标排序中分),每个子集中约有n/2个点,然后在每个子集中递归地求其最接近的点对。最近点对可能单纯在S1或S2中,也可能分别在S1和S2中。对于这个问题,
一维:第三种情况只可能是最靠近中线的那两个点。
二维:取两个子集递归求解最小值为d,第三种情况只会发生在 ( mid - d , mid + d ) 内,这个范围,mid左边p1,mid右边p2,p1中每个点最多在p2中存在6个点会更新答案,即按照y坐标排序后,p1每点最多只要检查p2中排好序的相继6个点。

循环赛日程表:

采用分治策略,将所有的选手分成两半,n个选手的比赛日程表就可以通过为n/2个选手设计的比赛日程表来决定。递归地用对选手进行分割,直到只剩下两个选手时,比赛日程表的制定就变得很简单了。这时只需要让这两个选手进行比赛即可。
 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值