一.概念

分块算法,顾名思义,就是把问题分成多个块,然后按块来解决问题。适用的范围很广,通常是用在单点查询和某一区间的加减乘除。说白了,就是另类的一种暴力算法罢了

二.分块的编写

通过例题来讲解会更容易理解点,也便于我写编写的思路
例子很简单,给定一组数据num[]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16},求在[2,9]范围内都加上一个数 2,然后查询num[5]的值

1.块的长度
在分块算法中,我们通常都是设每一个块的长度为sqrt(n),这样我们就把n个数据分为n/sqrt(n)个块。在此例中,n=16,所以我们需要把他分为4个块,每个块长度为4,如下图

2.块的标记
知道了每一个块的长度之后,为了操作方便,我们需要记录每个数所属的块,这样,在之后的操作时会大大降低我们的时间复杂度,标记只需要创建一个数组block[i]=b,表示第i个数属于x块。标记完之后如下图

3.块的操作
在对区间进行操作时,我们一般都对不完整的块进行暴力处理,对完整的块进行标记。在例题中,我们需要创建一个add数组来标记整个方块,则add[i]=c表示方块i整体加上c,如下图,带颜色的是暴力处理过的部分,这里add[2]=2,就是表示第2个方块所有的数都要加上2,这样减少了对这些数操作的时间。在数据很大的区间时,时间上的优势会更为明显

4.查询
那么该暴力解决的暴力解决了,该标记的块也标记了,查询的时候我们该怎么做呢?
很简单,如果要查询num[i]的值,直接输出num[i]+add[block[i]],意思就是当前的值加上所属的块所标记的值,例如num[5]=5,而block[5]=2,add[2]=2,那么输出就是num[5]+add[block[5]]=5+add[2]=5+2=7.

5.例题
看完上面的可以看下这个例题数列分块入门1
下面是题解代码

#include <iostream>using namespace std;
const int MAXN = 50000 + 5;
int a[MAXN],add[MAXN],block[MAXN],n;void Add(int L,int R,int v)//[L,R]上加上v
{for(int i=L; i<=min(R,block[L]*sqrt(n)); i++) { //暴力处理左边不完整区间 a[i] += v;}if(block[R] == block[L])return;for(int i=(block[R]-1)*sqrt(n)+1; i<=R; i++) {  //暴力处理右边不完整区间a[i] += v;}for(int i=block[L]+1; i<=block[R]-1; i++) {       //完整区间处理,打标记add[i]+=v;}
}int query(int L,int R)//查询a[R]
{return a[R] + add[block[R]];
}int main()
{cin>>n;for(int i=1; i<=n; i++) {cin>>a[i];block[i]=(i-1)/sqrt(n)+1;//sqrt(n)为长度,标记每个数所属的分块}for(int i=1; i<=n; i++) {int opt,L,R,v;cin>>opt>>L>>R>>v;if(op==0)Add(L,R,v);else printf("%d\n".query(L,R));}return 0;
}

三.总结

简单来说,分块算法分为几步

  1. 将要处理的数据分块
  2. 对每个数都标记所属的块
  3. 对于不完整的块暴力处理,完整的块进行处理的标记

知道了区间加法和查询,其实可以变化成很多种写法,例如区间乘法,区间求和,区间减法,区间各个操作的组合,修改等,又因为每次处理的数据只有sqrt(n)个,所以时间复杂度也大大降低了。不过其实对于这么区间操作,我们有更优秀的算法,例如线段树和树状数组,这些的时时间复杂度都达到了O(log n)而查询仅需O(1),不过那些比较难以理解,而分块算法的最大优势就是容易理解。所以学好分块,也是很重要的!

【算法】分块初步详解相关推荐

  1. python如何调用文件进行换位加密_python 换位密码算法的实例详解

    python 换位密码算法的实例详解 一前言: 换位密码基本原理:先把明文按照固定长度进行分组,然后对每一组的字符进行换位操作,从而实现加密.例如,字符串"Error should neve ...

  2. DL之AlexNet:AlexNet算法的架构详解、损失函数、网络训练和学习之详细攻略

    DL之AlexNet:AlexNet算法的架构详解.损失函数.网络训练和学习之详细攻略 相关文章 Dataset:数据集集合(CV方向数据集)--常见的计算机视觉图像数据集大集合(建议收藏,持续更新) ...

  3. DL之ShuffleNet:ShuffleNet算法的架构详解

    DL之ShuffleNet:ShuffleNet算法的架构详解 相关文章 DL之ShuffleNet:ShuffleNet算法的简介(论文介绍).架构详解.案例应用等配图集合之详细攻略 DL之Shuf ...

  4. DL之MobileNetV2:MobileNetV2算法的架构详解(包括ReLu的意义)

    DL之MobileNet V2:MobileNetV2算法的架构详解 相关文章 DL之MobileNetV2:MobileNetV2算法的简介(论文介绍).架构详解.案例应用等配图集合之详细攻略 DL ...

  5. DL之SqueezeNet:SqueezeNet算法的架构详解

    DL之SqueezeNet:SqueezeNet算法的架构详解 相关文章 DL之SqueezeNet:SqueezeNet算法的简介(论文介绍).架构详解.案例应用等配图集合之详细攻略 DL之Sque ...

  6. ​​​​​​​DL之ResNeXt:ResNeXt算法的架构详解

    DL之ResNeXt:ResNeXt算法的架构详解 相关文章 DL之ResNeXt:ResNeXt算法的简介(论文介绍).架构详解.案例应用等配图集合之详细攻略 DL之ResNeXt:ResNeXt算 ...

  7. 【算法知识】详解堆排序算法

    点击蓝色字关注我们! 什么是堆 「堆」首先是一个完全二叉树,「堆」分为「大顶堆」和「小顶堆」: 「大顶堆」 : 每个节点的值大于或等于其左右孩子节点的值,称为大顶堆. 「小顶堆」同理就是每个节点的值小 ...

  8. 【算法知识】详解基数排序算法

    已发布: [算法知识]详解选择冒泡算法 [算法知识]详解选择排序算法 [算法知识]详解插入排序算法 [算法知识]详解快速排序算法 [算法知识]详解归并排序算法 基本思想 基数排序的思想是将整数按位数切 ...

  9. 【算法知识】详解归并排序算法

    已发布: [算法知识]详解选择冒泡算法 [算法知识]详解选择排序算法 [算法知识]详解插入排序算法 [算法知识]详解快速排序算法 基本思想 归并排序的基本思想是: 先将序列一次次分成子序列,直到子序列 ...

最新文章

  1. 服务器和运行内存,服务器运行内存不够的解决方法
  2. 打造跨平台.NET Core后台服务
  3. Hologres如何支持亿级用户UV计算
  4. linux下的socket在哪个头文件,linux下socket编程常用头文件
  5. CorePress-v4.5网站主题 WordPress主题
  6. 清华又揽一位AI大牛!前微软全球副总裁开招博士生!
  7. 怎么把python添加到path_如何将python的路径加到path中
  8. 马化腾:一推就倒!中国技术实力只是表面辉煌罢了
  9. C语言常见的关键字汇总
  10. 人工智能中蕴含的情商
  11. C语言-快速排序实现
  12. 一个免费在线文件处理网站-HEIC转JPG Word转长图 PPT转长图 转成JPG 转成PNG 转成BMP(保姆级图文)
  13. 4. gstimxv4l2src.c源码分析
  14. 秒懂Https之CA证书与自签名证书漫谈
  15. 请同学检查地址是否有误:CSDN博客地址汇总(网络121、网络131、计科1111-1114)
  16. NLP学习基础入门(上)
  17. 申宝策略-行业与概念板块跌多涨少
  18. armbian不拔掉TF卡使用usb移动硬盘启动
  19. 7.3 写一个判断素数的函数,在主函数输入一个整数,输出是否为素数的信息。
  20. conda安装jupyter notebook,解决无法远程

热门文章

  1. qq 请使用常用设备或手机号登录
  2. FPGA学习笔记_Quartus II_In system sources and probes editor(ISSP)调试工具的使用
  3. tp操作mysql_tp 在tp中查询mysql中使用MySQL的函数if()等
  4. vue中的el-input设置灰显不可编辑
  5. Android Gilde使用
  6. 每天记录学习的新知识 : gilde 和 picasso的区别
  7. 由Archive包导出IPA
  8. 关于深度学习主机的一些选配问题
  9. 地税计算机考试题库,行测题库:行测每日一练资料分析练习题
  10. 欧冠杯:葡萄牙VS法国——葡萄牙首次夺冠!