关于分制(也就那些事儿)

分治是一种将复杂问题分解为较小部分并分别解决的策略。它包括分解、解决子问题和合并结果三个步骤。二分法是分治的一种特殊形式,常见于快速排序等算法中。应用分治法时,问题需满足可分解、子问题独立且有通用解决方案、可合并等特点。通过实例和代码展示,有助于深入理解分治思想。
摘要由CSDN通过智能技术生成

1.什么是分治?
所谓分治,运用拆词法,就是分而治之
就是将一个复杂的大问题分成 几个规模较小 且 可以用同样方法处理 且 可以通过对小问题的求解得到大问题答案 的若干小问题
然后通过解决 容易解决的小问题得到大问题答案
上面是分治的思想
可能有点云里雾里,其实这个分治有二分的思想:
二分:通过把有序区间平分更快找到答案
分治:通过把区间分成多份让题面更简单
因为把题目分成2^n个小问题的分治比较常见
所以人们定义二分法:把问题分解成两个较小问题求解的分治
注意二分是一种思想,二分法是对于这种思想的运用
————
好吧我承认我有点偏题,对于分治还没有特别理解的看例子:
快速排序(当然归并也是)
其实快排就是二分法的体现
快速排序的主要思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的数据都比另外一部分的数据要小,然后再按此方法对这两部分分别进行快排。
(这里确实讲得不是很清楚,主要是czc已经全讲了)
2.分治如何解决问题?
(1)分解,将要解决的问题划分成若干规模较小的同类问题;
(2)求解,当子问题划分得足够小时,用较简单的方法解决;
(3)合并,按原问题的要求,将子问题的解逐层合并构成原问题的解。
3.如何实现分治?
(1)递归
(2)结构不复杂的可以用循环
4.什么时候可以用分治
(1)这个问题小到一定程度的时候很容易解决
(2)解决此问题的方法应该是通用的
(3)这个问题的解决应是最优解
(4)这个问题的解可以合并
(5)这些若干问题彼此不相关

老规矩,来几道例题,你基本上就懂了:
在这里插入图片描述
图片没有传完,不过问题不大,就剩下几组数据而已(铺地毯)。
分治代码:
下面展示一些 内联代码片

#include<cstdio>
int f2(int a)
{
   
    int ans=1;
    for(int i=1;i<=a;i++)
    {
   
        ans=ans*2;
    }
    return ans;
}
int findx(int m,int x)
{
   
    if(x<=m)
    return m+1;
    return m;
}
int findy(int m,int y)
{
   
    if(y<=m)
    return m+1;
    return m;
}
int pd(int mx,int my,int x,int y)
{
   
    if(x<=mx&&y<=my)
    {
   
        return 3;
    }
    if(x<=mx&&y>my)
    {
   
        return 1;
    }
    if(x>mx&&y>my)
    {
   
        return 4;
    }
    return 2;
}
int sum=0;
void fz(int xmin,int xmax,int ymin,int ymax,int x,int y)
{
   //xmin,与ymin是真正的左上角-1
  
 
sum++;
     
    if(xmax-xmin<=1)return;
//  printf("%d %d %d %d %d %d\n",xmin,xmax,ymin,ymax,x,y);
    int mx=(xmin+xmax)/2;
    int my=(ymin+ymax)/2;
    //mx,my是左上方块的右下角
      
    int xi=findx(mx,x);
    int yi=findy(my,y);
     
    int p=pd(mx,my,x,y);
    printf("%d %d %d\n",xi,yi,p);
     
     
    if
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值