前言
我们常常会遇到一些规模很大的问题,大到无从下手,不知道怎么解决。这时候怎么办,将大问题划分为小问题,小问题还不会解怎么办,那就再分,直到问题小到你会解为止。这种思想就是分治。
分治
学习分治,就是三个字,“分”,“治”,“合”。
分(divide):将规模为n的原问题分拆为k个小问题,每个小问题的规模都严格小于n;
治(conquer):如果小问题的规模大于事先设定的阈值n0,则接着分,递归求解,否则直接求解小规模问题
合(merge):将k个子问题的解组合形成原问题的解
算法复杂度
下面来看看分治算法有什么应用
1. 循环比赛
问题:有n=2^k位选手参加一项单循环比赛,即每位选手都要与其他n-1位选手比赛,且在n-1天内每人每天进行一场比赛,1)设计算法以得到赛程安排;2)若比赛结果存放在一矩阵中,针对该矩阵设计O(nlogn)的算法,为各个选手赋予次序P1,P2,…,Pn,使得P1打败P2,P2打败P3,依此类推。
解
1)
设table[i][j]表示第i个人在第j天遇见的对手n个选手分两堆
N = 2^k
假设能够对2^k-1大小的堆能够安排比赛顺序table
对于2^k 大小的矩阵
这样对原table左上角复制到右下角
左下角是左上角矩阵每一个原元素加n/2
右上角矩阵是左下角的复制
新table就是n个人的日程
基础情况
2个