首页 > 其他分享 >可持久化数据结构

可持久化数据结构

时间:2023-03-09 09:22:22浏览次数:31  
标签:持久 线段 查集 区间 数据结构 节点

现阶段常用的可持久化数据结构大概有以下三类:可持久化线段树、并查集、Trie 树。
因此本文将围绕这三个大类来讲。

1.可持久化线段树/可持久化数组

可持久化线段树本来有一个更为脍炙人口的名字,但由于某些原因我们将其称为可持久化线段树。

考虑在单点修改线段树时,由于线段树高 \(\log n\) 层,每层只修改一个节点,因此新建这 \(\log n\) 个节点以保存更改后和更改前的值做到可持久化。

如果是区间修改,我们尝试着使用标记永久化,仅在查询时计算标记的贡献,统计出从根节点到当前区间的节点的标记和,再加上这个区间的值即为所求。

区间赋值可以维护时间戳,查询时找时间戳最大的修改的权值。

接下来是可持久化的经典应用:静态区间第 \(k\) 小。

首先将权值离散化,按照下标顺序以此将每个值加入线段树,这个线段树维护的是每个值的出现次数,运用可持久化线段树维护每加入一个值后线段树的状态。因此,\(l \sim r\) 中每个数出现的次数可以用 \(1\sim r\) 的线段树减去 \(1\sim l - 1\) 的线段树求出,即我们为 \(a_{l\sim r}\) 建了一棵线段树。
接下来考虑如何找到第 \(k\) 小的值,如果当前区间左儿子的值不足 \(k\),则向右儿子转移,否则向左儿子转移。每个区间左儿子的值 \(v = val_{\operatorname{ls}_y - \operatorname{ls}_x}\),\(x,y\) 分别是区间左端点减 \(1\) 和右端点线段树当前节点的编号。这一点可以从线段树的加减法推导得出。
单纯推导比较简单,建议多做例题分析。

2.可持久化并查集

基于可持久化数组。
考虑朴素的并查集 merge,我们只将一个点的 fa 改变了,因此可以用可持久化数组维护各个版本的并查集,此时无法使用路径压缩。因此,可以维护 siz 数组,每次将 siz 较小的向较大的合并。
并查集的应用范围大多用来查询连通性,可以猜测到可持久化并查集可以用来维护带有上下界的连通性问题。例如,按边权顺序加入并查集时,可以查询 \(u\) 和 \(v\) 之间是否可以通过一条边权不大于 \(w\) 的路径到达。

3.可持久化 Trie

同样依赖于可持久化线段树的思想,插入一个数或字符串时新建节点,在上一个版本的基础上新建节点。

大部分可持久化数据结构所涉及到的思路是每次操作对整个数据结构的影响不会太大,因此利用重复信息新建一个数据结构。这类压缩重复信息的思想在很多题目中都有应用。

例题


标签:持久,线段,查集,区间,数据结构,节点
From: https://www.cnblogs.com/misterrabbit/p/17192279.html

相关文章

  • 【数据结构入门】单链表(SList)详解(增、删、查、改)
    1、链表的概念及结构1.1链表的概念概念:链表是一种物理存储结构上非连续、非顺序的存储结构,但链表在逻辑上是连续的,顺序的,而数据元素的逻辑顺序是通过链表中的指针连接次序实......
  • 持久化技术Mybatis知识精讲【形成知识体系之路】
    环境要求JDK1.8及以上版本MySQL数据库ApacheMaven3.6.1构建工具IDEA/VSCode/Eclipse开发工具任选其一思维导图:XmindZEN技术要求熟悉Java语言熟悉数......
  • 嵌入式C语言九大数据结构操作方式详解
          数据结构想必大家都不会陌生,对于一个成熟的程序员而言,熟悉和掌握数据结构和算法也是基本功之一。数据结构本身其实不过是数据按照特点关系进行存储或者组织......
  • 常用数据结构的理解
    常用数据结构的理解首先,什么是数据结构?即人们抽象出来的描述现实世界实体的数学模型(非数值计算)及其上的操作(运算),在计算机上的表示和实现。按一定的逻辑结构组成的一批数据......
  • 7、Redis持久化存储的两种方式
    1.Redis持久化存储的两种方式RDB方式RDB存储是Redis实现的一种存储机制(默认开启)AOF方式AOF存储方式,直接把操作的命令记录下来,保存到一个文件里,类似mysql的......
  • 数据结构01
    一.总览二.数据结构的基本概念2.1.导图2.2.什么是数据?数据是信息的载体,是描述客观事物属性的数、字符及所有能够被输入到计算机中并被计算机程序识别和处理的符号的......
  • 数据结构第一篇:线性表的顺序存储结构
    一:线性表的抽象数据类型(ADT)描述:ADTList{Data:D={a1,a2,......,an}//每个元素的类型均为ElemType类型。其中,除第一个元素a1外,每一个元素有且只有一个直接前驱......
  • 《数据结构与算法》阅读笔记——表1
    1.表与链表:表:连续存储一组数的数据结构。假定表中存在着某个元素i,则i的前一个元素为i的前驱元素,i的后一个元素为i的后继元素。对表的操作:1.PrintList:输出2.MakeEmpty:创建......
  • 算法与数据结构——整数数组求最大子数组
    题目:输入一个整型数组,数组里有正数也有负数。数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。求所有子数组的和的最大值。要求时间复杂度为O(n)。代码:......
  • C/C++ 数据结构链栈的基本操作实现
    #include<iostream>#include<string.h>usingnamespacestd;typedefintSElemType;typedefstructStackNode{SElemTypedata;structStackNode*next;......