一些常用的数据结构维护手法

这篇会理论上讲一讲常用的数据结构维护手法。

我是嘴巴选手我自豪!

①cdq分治

现在我们有一些修改,有一些询问,修改之间独立。

我们考虑分治,对于左右两半分别分治,然后对于左边的修改计算对右边询问的贡献。

本身的复杂度是O(nlogn)。

②整体二分

现在我们有一些修改,有一些询问。

我们需要求出,在最少多少组修改之后满足题目条件。(或者可以转化成这样)

对于单组询问,我会二分!对于多组询问,真不巧,二分超时了...

我们考虑整体二分。整体二分的框架大概是这样:

def 整体二分(el,er,ql,qr):
    if el==er:
        ql到qr的答案都是el
        return
    em=(el+er)/2
    模拟el...em的操作
    看一下ql...qr哪些满足了
    满足的放到ql...qm,不满足的放到qm+1...qr
    整体二分(em+1,er,qm+1,qr)
    撤销el...em的操作
    整体二分(el,em,ql,qm)

本身的复杂度是O(nlogn)的。

③时间倒流

现在我们有一些修改(例如删除边啥的),有一些询问。

修改反着做比正着做容易。

既然可以离线,干脆把修改倒过来做。

④根号重构

现在我们有一些修改,有一些询问,修改之间独立。

对于一堆修改计算对一堆询问的贡献复杂度比较高(例如和询问修改个数无关,而和其它东西有关),而单个修改对单个询问贡献复杂度很低。

同时我们可以用相对比较低的复杂度把一坨修改预处理一波,计算预处理之后的东西对单个询问贡献复杂度很低。

我们可以每根号个修改预处理一次,然后询问就枚举还没预处理的修改以及预处理好的算贡献就可以了。

本身的复杂度是O(n√n)。

⑤莫队

现在我们没有修改,只有一大堆询问。

询问十分复杂,但是如果知道了[l,r]的答案,可以很快得到[l,r-1]和[l,r+1]和[l-1,r]和[l+1,r]的答案。

考虑把l分成根号块,把所有询问排序,按l所在的块编号为第一关键字,r为第二关键字排序,暴力拓展当前的区间。

本身的复杂度是O(n√n)。

⑥线段树分治

现在我们有一些区间修改,有一些单点询问,询问在所有修改之后。

比较容易支持对当前状态进行修改,并撤销这次修改(如果不再进行其它修改)。

考虑对于区间建出线段树结构(只要结构),然后对于每个修改下放到log个区间,然后我们在线段树上分治,进这个点的时候进行这个点所有修改,出这个点的时候撤销这些修改,对于叶节点记录一下答案。

本身的复杂度是O(nlogn)。

⑦二进制分组

现在我们有一些修改,有一些询问,修改之间独立。强制在线。

我们可以以一个与修改个数有关的时间预处理出一些修改的信息,对于一个询问可以快速地在预处理后的一些修改中获取信息。

我们可以采用二进制分组的思想,感觉这种做法只能看图了...

本身的复杂度是O(nlogn)。

(遇到新的再更新qaq)

时间: 2024-12-06 14:25:33

一些常用的数据结构维护手法的相关文章

游戏制作中的大宝剑---常用的数据结构与算法

前言 时间流逝,物是人非,就好像涌动的河流,永无终焉,幼稚的心智将变得高尚,青年的爱慕将变得深刻,清澈之水折射着成长. ----------<塞尔塔传说> PS:为了方便大家阅读,个人认为比较重要的内容-------红色字体显示 个人认为可以了解的内容-------紫色字体显示 --------------------------------------------------------------------------- ---------------------------------

Python 常用查找数据结构及算法

一.基本概念 二.无序表查找 三.有序表查找 3.1 二分查找(Binary Search) 3.2 插值查找 3.3 斐波那契查找 四.线性索引查找 4.1 稠密索引 4.2 分块索引 4.3 倒排索引 五.二叉排序树 六. 平衡二叉树 七.多路查找树(B树) 7.1 2-3树 7.2 2-3-4树 7.3 B树 7.4 B+树 八.散列表(哈希表) 8.1 散列函数的构造方法 8.2 处理散列冲突 8.3 散列表查找实现 8.4 散列表查找性能分析 参考书目<大话数据结构> 一.基本概念

Unity3D中常用的数据结构总结与分析

Unity3D中常用的数据结构总结与分析 c#语言规范 阅读目录 1.几种常见的数据结构 2.几种常见数据结构的使用情景 来到周末,小匹夫终于有精力和时间来更新下博客了.前段时间小匹夫读过一份代码,对其中各种数据结构灵活的使用赞不绝口,同时也大大激发了小匹夫对各种数据结构进行梳理和总结的欲望.正好最近也拜读了若干大神的文章,觉得总结下常用的数据结构以供自己也能灵活的使用变得刻不容缓.那么还是从小匹夫的工作内容入手,就谈谈在平时使用U3D时经常用到的数据结构和各种数据结构的应用场景吧. 回到目录

在使用R做数据挖掘时,最常用的数据结构莫过于dataframe了,下面列出几种常见的dataframe的操作方法

原网址 http://blog.sina.com.cn/s/blog_6bb07f83010152z0.html 在使用R做数据挖掘时,最常用的数据结构莫过于dataframe了,下面列出几种常见的dataframe的操作方法.1.查看数据 head(dataframe) # 查看数据前10行tail(dataframe) # 查看数据后10行 2.合并数据(1)data.frame(x,y)x,y是dataframe或者一列数据,x和y的行数一样,该操作得到一个新的dataframe,该dat

关于海量数据常用的数据结构

数据结构 应用场景 示例 哈希表 要求所有键值对放入内存,查找可以在常数时间内完成. l  提取某日志访问百度次数最多的IP l  统计不同电话号码的个数 堆 插入和调整需要O(logn)时间,n为堆元素的个数,而获取堆顶元素只需要常数时间. l  求出海量数据前K大的数 l  求海量数据流的中位数 BitMap 通常记录整数出现的情况,用来快速查找.数字判重.删除元素等. l  统计不同电话号码的个数 l  2.5亿个整数中查出不同重复的整数个数 双层桶 两次寻址方式以节省内存,通常用在求第K

Lua常用的数据结构表示

1.矩阵 Lua中有两种表示矩阵的方法,一是“数组的数组”.也就是说,table的每个元素是另一个table.例如,可以使用下面代码创建一个n行m列的矩阵:mt = {}          -- create the matrixfor i=1,N do    mt = {}    -- create a new row    for j=1,M do      mt[j] = 0    endend由于Lua中table是对象,所以每一行我们必须显式地创建一个table,比起c或pascal,

Redis5种常用的数据结构

一.数据结构 五种常用的数据结构:string.hash.list.set.zse,以及三种不常用的:hyperloglog.geospatial.streams. 二.常用数据结构的使用 1.String键 字符串键的使用场景:如分布式锁.计数器.分布式全局序列ID 2.Hash键        存在的最主要的意义就是:减少内存的占用,原因在于比如对key的过期时间的扫描,只需要扫描第一层key即可 Redis采用的数据分配方案是预分配16384个hash槽,Hash键可以理解成是通过用第一层

java中常用的数据结构--Collection接口及其子类

java中有几种常用的数据结构,主要分为Collection和map两个主要接口(接口只提供方法,并不提供实现),而程序中最终使用的数据结构是继承自这些接口的数据结构类. 一.集合和数组的区别 二.Collection集合和Map集合 三.Collection接口 1.定义 public interface Collection<E> extends Iterable<E> {} 它是一个接口,是高度抽象出来的集合,它包含了集合的基本操作:添加.删除.清空.遍历(读取).是否为空.

常用集合类数据结构(持续更新中)

零.约定 1.  如果没有特殊说明,均指jdk 6,7,8一样 2.  源码分析出来的,有错误,请务必告知,谢谢 一.链表 1.  ArrayList<>() a) 基本介绍  i. 动态数组的数据结构 ii.新增时,容量超过当前容量,会新new一个数组 iii. 随机查询忧,添加删除劣 b)         常用构造函数 i.              ArrayList() jdk6初始化为容量10的数组 jdk7,8初始化为容量为0的数组(EMPTY_ELEMENTDATA) ii.