Persistent data structure 不可变数据结构
持久性变数据不要和持久储存相混淆
在计算机中持久性数据或非临时数据是一种数据结构,在修改时始终保持其自身的先前版本。这些数据实际上是不可变的,因为对这类数据操作不会明显的改变数据结构,而是始终产生新的数据结构。
部分持久性数据:如果可以访问某个数据所有版本,但只能修改最新的版本,则数据是部分持久的。
汇合持久性数据:如果可以从之前的两个数据版本通过合并或者融合,可以创建一个新版本数据,则数据是汇合持久的。
数据结构不是持久的则称之为临时的。
持久性数据结构在逻辑编程和函数式编程中特别常见,因为这些范式中的语言不鼓励或者完全禁用可变的数据结构。
部分持久和完全持久
在部分持久数据结构中,开发者可以查看任意的之前的版本,但只能更新最新版本,这意味着数据结构每个版本之间呈线性排序的。
在完全持久数据中,可以在任何版本的数据上进行更新和查询。
复制后重写
创建持久数据结构的一种方法是使用平台提供的临时数据结构(如数组)将数据存储在数据结构中,并使用写入时复制语义复制整个数据结构,以便对数据结构进行任何更新。这是一种低效的技术,因为每次写入都必须复制整个后备数据结构,从而导致对大小为 n 的数组进行 m 次修改的最坏情况 O(n·m) 性能特征。
扩展节点
扩展节点方法是在节点本身中记录对节点字段所做的所有更改,而不擦除字段的旧值。这就要求允许节点变得任意“胖”。换句话说,每个节点都包含与临时节点相同的信息和指针字段,以及任意数量的额外字段值的空间。每个额外的字段值都有一个关联的字段名称和一个版本标记,该标记指示命名字段更改为具有指定值的版本。此外,每个节点都有自己的版本标记,指示创建节点的版本。具有版本戳的节点的唯一用途是确保每个节点每个版本的每个字段名称仅包含一个值。为了在结构中导航,节点中的每个原始字段值都有一个零的版本戳。
路径重联
使用路径复制方法,将在路径上创建所有节点的副本,以指向即将修改的任何节点。然后,这些更改必须通过数据结构级联回来:必须将指向旧节点的所有节点修改为指向新节点。这些修改会导致更多的级联更改,依此类推,直到到达根节点。
上述两种的结合方式
在每个节点中,存储一个修改框。此框可以保存对节点的一次修改(对其中一个指针的修改,或者对节点的键的修改,或者对某个其他特定于节点的数据的修改),以及应用该修改时的时间戳。最初,每个节点的修改框都是空的。每当访问节点时,都会选中修改框,并将其时间戳与访问时间进行比较。(访问时间指定要考虑的数据结构的版本。)如果修改框为空,或者访问时间早于修改时间,则忽略修改框,只考虑节点的正常部分。如果访问时间晚于修改时间,则使用修改框中的值,覆盖节点中的该值。
修改节点的工作方式如下所示。(假定每个修改都涉及一个指针或类似字段。)如果节点的修改框为空,则用修改填充该框。否则,修改框已满。将创建节点的副本,但仅使用最新值。修改直接在新节点上执行,无需使用修改框。(新节点的某个字段将被覆盖,其修改框将保持为空。) 最后,此更改将级联到节点的父级,就像路径复制一样。(这可能涉及填写父级的修改框,或以递归方式制作父级的副本。如果节点没有父节点(它是根),则会将新根添加到排序的根数组中。
使用此算法,给定任何时间t,在时间t的数据结构中最多存在一个修改框。因此,时间 t 的修改将树拆分为三个部分:一部分包含时间 t 之前的数据,一部分包含时间 t 之后的数据,一部分不受修改的影响。
Persistent data structure 不可变数据结构的更多相关文章
- Heap(data structure)——堆(数据结构)(源自维基百科)
源地址:http://en.wikipedia.org/wiki/Heap_%28data_structure%29 在计算机科学领域,堆是指一个特定的基于数结构的数据结构,其必须满足堆属性: 如果A ...
- Persistent Data Structures
原文链接:http://www.codeproject.com/Articles/9680/Persistent-Data-Structures Introduction When you hear ...
- [LeetCode] All O`one Data Structure 全O(1)的数据结构
Implement a data structure supporting the following operations: Inc(Key) - Inserts a new key with va ...
- UVa 11995:I Can Guess the Data Structure!(数据结构练习)
I Can Guess the Data Structure! There is a bag-like data structure, supporting two operations: 1 x T ...
- 面试总结之数据结构(Data Structure)
常用数据结构及复杂度 http://www.cnblogs.com/gaochundong/p/3813252.html 常用数据结构的时间复杂度 Data Structure Add Find De ...
- 【暑假】[实用数据结构]UVa11995 I Can Guess the Data Structure!
UVa11995 I Can Guess the Data Structure! 思路:边读边模拟,注意empty的判断! 代码如下: #include<iostream> #inclu ...
- [leetcode]432. All O`one Data Structure全O(1)数据结构
Implement a data structure supporting the following operations: Inc(Key) - Inserts a new key with va ...
- FAT文件系统规范v1.03学习笔记---2.FAT区之FAT数据结构(Fat Data Structure)
1.前言 本文主要是对Microsoft Extensible Firmware Initiative FAT32 File System Specification中文翻译版的学习笔记. 每个FAT ...
- [LeetCode] Two Sum III - Data structure design 两数之和之三 - 数据结构设计
Design and implement a TwoSum class. It should support the following operations:add and find. add - ...
随机推荐
- .NET性能优化-使用SourceGenerator-Logger记录日志
前言 在现在许许多多的应用系统中,日志非常关键,它即是排查问题的强力工具,也是程序员居家旅行工作甩锅必备良品. 在团队中编码中,我们都要求对于那些会变更数据的接口.调用第三方的接口记录请求和响应参数, ...
- 【点击云游台湾省】今天,老子云在台湾省建了个3D房子!
今日热搜仍然聚焦台湾省,中国新闻网发文:地图已经可以显示台湾省的每个街道.网友一片叫好! 台湾省通过平面图观察,难免看的不够真切,其实现在已经可以通过3D视角云游台湾省了! 老子云这次通过自研技术,还 ...
- postgresql逻辑备份工具pg_dump和pg_resotre学习
(一)pg_dump备份 pg提供了pg_dump和pg_dumpall命令进行数据库的备份,pg_dumpall是将整个pg集群转储到一个脚本文件中,而pg_dump命令可以选择一个数据库或者部分表 ...
- Dolphin Scheduler 1.2.0 部署参数分析
本文章经授权转载 1 组件介绍 Apache Dolphin Scheduler是一个分布式易扩展的可视化DAG工作流任务调度系统.致力于解决数据处理流程中错综复杂的依赖关系,使调度系统在数据处理流程 ...
- Git 04 项目搭建
参考源 https://www.bilibili.com/video/BV1FE411P7B3?spm_id_from=333.999.0.0 版本 本文章基于 Git 2.35.1.2 创建工作目录 ...
- MapReduce计算流程
MapReduce的计算流程 1.1 原始数据File The books chronicle the adventures of the adolescent wizard Harry Potter ...
- windows绕过杀软添加账户密码
windows绕过杀软添加账户密码 起因:system权限下存在杀软无法添加账户信息 绕过方法 1.C#脚本 运行后会在目标机器上创建一个用户为 wh4am1 密码为 qqai@love 的 Admi ...
- windows优化原神
原神3.0新地图很卡顿? 锐距显卡带不动? 看一下我的配置 英特尔i5-1135G7 内存16GB可以拓展32GB 固态512GB 原神优化前帧率50左右 优化后59-60最差55 展示图原神设置图 ...
- const修饰符总结
1.什么是const? const就是constant的缩写,意思是"恒定不变的",它是定义只读变量的关键字,或者说const是定义常变量的关键字,常类型的变量或对象的值是不能被更 ...
- electron 起步
electron 起步 为什么要学 Electron,因为公司需要调试 electron 的应用. Electron 是 node 和 chromium 的结合体,可以使用 JavaScript,HT ...