• 分块学习笔记


    (2019/10/3 UPD:)
    我回来填坑了

    分块:

    联想一下线段树,分块也是一种基于对数据进行信仰合理分治以提高处理效率的算法

    考虑一下线段树是一分为二的树形数据结构,即有从属关系(一个节点的两子节点从属于它)
    而分块是一种线性的分治方式,它把数据分成若干个互不影响的块,之后对于一些范围较大的询问在大块上整体查询,小块上暴力
    考虑在大块上打整体标记记录整体信息,比如一个块的和或加法乘法标记(类似线段树的(lazytag)
    然后是大家喜闻乐见的 块大小是(sqrt(n))的,合理脑补可以发现这个时候均摊复杂度最小 (O(nsqrt(n)))
    想证明的话放个均值

    可能有点抽象 脑补一个例题

    给定长度为(n)的序列支持区间加区间求和,(n <= 10^5)
    考虑预处理每个块的和,以及每个块上打加法标记
    每次修改时大块直接打标记,小块暴力加在原数上
    查询的时候同理,同时把加法标记累加到(ans)
    ...
    大概讲了一下思想,其实和线段树有很多类似的地方,可以自行理解一下

    另外一个很妙的(Point)是分块对于数据的分治是线性的,和线段树不同,线段树对数据的处理是有传递关系的(一个节点会继承它两个子节点的信息,虽然继承这个词不太妙),所以维护的信息一定要支持区间可加性,而分块由于块与块之间互不影响,可以维护更多类型的信息,但跑得比线段树慢

    其实生活中很多地方也能遇到分块的思想,把算法推而广之应用至生活中岂不更为妙哉

  • 相关阅读:
    go第二天
    go第一天
    engish
    english
    git 生成公钥
    tp5 验证码
    css处理文本折行截断
    数组对象总结(牢记)
    全局css样式
    Flexbox 弹性盒子布局
  • 原文地址:https://www.cnblogs.com/kma093/p/10295190.html
Copyright © 2020-2023  润新知