分治算法

前言

我们常常会遇到一些规模很大的问题,大到无从下手,不知道怎么解决。这时候怎么办,将大问题划分为小问题,小问题还不会解怎么办,那就再分,直到问题小到你会解为止。这种思想就是分治。

分治

学习分治,就是三个字,“分”,“治”,“合”。

分(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个

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值