【学习第三天】分治

分治

  • 分治的适用条件:

    ①具有最优子结构
    ②子问题互相独立
    ③子问题的最优解可以合并得到全局的最优解
  • 基本形式

void solve(n){
	//边界条件,如if(n==1){...}
	//把n分成若干个小问题,比如分成两个大小为n/2的子问题:solve(n/2),solve(n/2)
	//合并答案 return ;
}
  • 回忆归并排序

void solve(int l,int r){
	if(l==r)
		return ;
	int mid=(l+r)/2;
	solve(1,mid);
	solve(mid+1,r);
	...//归并A[l...mid]和A[mid+1...r],得到A[l...r]排好序的结果

对于一个长度为n的序列,统计符合某要求的子区间[l,r]的个数。

int solve(int l,int r){
	if(l==r){...}
	int cnt=0,mid=(l+r)/2;
	cnt+=solve(l,mid);
	cnt+=solve(mid+1,r);
	...//统计左端点在[l,mid],右端点在[mid+1,r]中的答案个数,加入cnt
	return cnt;
  • 复杂度分析:

    T(n)=kT(n)+f(n)
    • 对于归并排序:
      T(n)=2T(n/2)-O(n)=>O(n log n)
    • 其他情况:
      T(n)=T(n/2)+O(n)=>O(n)
      T(n)=T(n/2)+O(n2)=>O(n2)
  • 分治法的延伸

    • 二分
      每次把一个区间一分为二
    • 倍增
      每次把一个区间和下一个和它等长的区间合并
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值