持久性变数据不要和持久储存相混淆

在计算机中持久性数据或非临时数据是一种数据结构,在修改时始终保持其自身的先前版本。这些数据实际上是不可变的,因为对这类数据操作不会明显的改变数据结构,而是始终产生新的数据结构。

部分持久性数据:如果可以访问某个数据所有版本,但只能修改最新的版本,则数据是部分持久的。

汇合持久性数据:如果可以从之前的两个数据版本通过合并或者融合,可以创建一个新版本数据,则数据是汇合持久的。

数据结构不是持久的则称之为临时的。

持久性数据结构在逻辑编程和函数式编程中特别常见,因为这些范式中的语言不鼓励或者完全禁用可变的数据结构。


部分持久和完全持久

在部分持久数据结构中,开发者可以查看任意的之前的版本,但只能更新最新版本,这意味着数据结构每个版本之间呈线性排序的。

在完全持久数据中,可以在任何版本的数据上进行更新和查询。

复制后重写

创建持久数据结构的一种方法是使用平台提供的临时数据结构(如数组)将数据存储在数据结构中,并使用写入时复制语义复制整个数据结构,以便对数据结构进行任何更新。这是一种低效的技术,因为每次写入都必须复制整个后备数据结构,从而导致对大小为 n 的数组进行 m 次修改的最坏情况 O(n·m) 性能特征。

扩展节点

扩展节点方法是在节点本身中记录对节点字段所做的所有更改,而不擦除字段的旧值。这就要求允许节点变得任意“胖”。换句话说,每个节点都包含与临时节点相同的信息和指针字段,以及任意数量的额外字段值的空间。每个额外的字段值都有一个关联的字段名称和一个版本标记,该标记指示命名字段更改为具有指定值的版本。此外,每个节点都有自己的版本标记,指示创建节点的版本。具有版本戳的节点的唯一用途是确保每个节点每个版本的每个字段名称仅包含一个值。为了在结构中导航,节点中的每个原始字段值都有一个零的版本戳。

路径重联

使用路径复制方法,将在路径上创建所有节点的副本,以指向即将修改的任何节点。然后,这些更改必须通过数据结构级联回来:必须将指向旧节点的所有节点修改为指向新节点。这些修改会导致更多的级联更改,依此类推,直到到达根节点。

上述两种的结合方式

在每个节点中,存储一个修改框。此框可以保存对节点的一次修改(对其中一个指针的修改,或者对节点的键的修改,或者对某个其他特定于节点的数据的修改),以及应用该修改时的时间戳。最初,每个节点的修改框都是空的。每当访问节点时,都会选中修改框,并将其时间戳与访问时间进行比较。(访问时间指定要考虑的数据结构的版本。)如果修改框为空,或者访问时间早于修改时间,则忽略修改框,只考虑节点的正常部分。如果访问时间晚于修改时间,则使用修改框中的值,覆盖节点中的该值。
修改节点的工作方式如下所示。(假定每个修改都涉及一个指针或类似字段。)如果节点的修改框为空,则用修改填充该框。否则,修改框已满。将创建节点的副本,但仅使用最新值。修改直接在新节点上执行,无需使用修改框。(新节点的某个字段将被覆盖,其修改框将保持为空。) 最后,此更改将级联到节点的父级,就像路径复制一样。(这可能涉及填写父级的修改框,或以递归方式制作父级的副本。如果节点没有父节点(它是根),则会将新根添加到排序的根数组中。
使用此算法,给定任何时间t,在时间t的数据结构中最多存在一个修改框。因此,时间 t 的修改将树拆分为三个部分:一部分包含时间 t 之前的数据,一部分包含时间 t 之后的数据,一部分不受修改的影响。

Persistent data structure 不可变数据结构的更多相关文章

  1. Heap(data structure)——堆(数据结构)(源自维基百科)

    源地址:http://en.wikipedia.org/wiki/Heap_%28data_structure%29 在计算机科学领域,堆是指一个特定的基于数结构的数据结构,其必须满足堆属性: 如果A ...

  2. Persistent Data Structures

    原文链接:http://www.codeproject.com/Articles/9680/Persistent-Data-Structures Introduction When you hear ...

  3. [LeetCode] All O`one Data Structure 全O(1)的数据结构

    Implement a data structure supporting the following operations: Inc(Key) - Inserts a new key with va ...

  4. 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 ...

  5. 面试总结之数据结构(Data Structure)

    常用数据结构及复杂度 http://www.cnblogs.com/gaochundong/p/3813252.html 常用数据结构的时间复杂度 Data Structure Add Find De ...

  6. 【暑假】[实用数据结构]UVa11995 I Can Guess the Data Structure!

    UVa11995  I Can Guess the Data Structure! 思路:边读边模拟,注意empty的判断! 代码如下: #include<iostream> #inclu ...

  7. [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 ...

  8. FAT文件系统规范v1.03学习笔记---2.FAT区之FAT数据结构(Fat Data Structure)

    1.前言 本文主要是对Microsoft Extensible Firmware Initiative FAT32 File System Specification中文翻译版的学习笔记. 每个FAT ...

  9. [LeetCode] Two Sum III - Data structure design 两数之和之三 - 数据结构设计

    Design and implement a TwoSum class. It should support the following operations:add and find. add - ...

随机推荐

  1. vue-cli 启动项目时空白页面

    vue-cli 启动项目时空白页面 在启动项目时 npm run serve / npm run dev 启动 vue 项目空白页:且终端及控制台都未报错 通过各种查阅发现在项目根目录中 vue-co ...

  2. 在DELL服务器上安装windows2012 r2服务器系统

    主要过程: 1.准备安装光盘,开启服务器,当出现画面按F10进入服务器自带光盘系统安装向导.(若没有系统光盘,可以用软蝶通刻一个服务系统到+R的光盘).进入后选择设置和安装系统. 2.开始安装前,提示 ...

  3. RestTemplate上传文件

    1.上传的文件是File类型 如果文件保存在本地,即可以通过File file = new File(path) 或者 文件路径地址获取到指定文件 public String uploadFile(F ...

  4. Dolphin Scheduler 1.2.0 部署参数分析

    本文章经授权转载 1 组件介绍 Apache Dolphin Scheduler是一个分布式易扩展的可视化DAG工作流任务调度系统.致力于解决数据处理流程中错综复杂的依赖关系,使调度系统在数据处理流程 ...

  5. 我与Apache DolphinScheduler的成长之路

    关于 Apache DolphinScheduler社区 Apache DolphinScheduler(incubator) 于17年在易观数科立项,19年3月开源, 19 年8月进入Apache ...

  6. Luogu1038 神经网络 (拓扑排序)

    拓扑排序,裸的,水的. 第一发:题读错,输出错,输入错,到处错 \(\longrightarrow\) 40pts (excuse me ?) 第二发:漏了输入层特判 \(\longrightarro ...

  7. Luogu1382 楼房 (线段树 扫描线)

    各种低级错误.jpg,数组开大就过.jpg 线段树离散化扫描线 #include <iostream> #include <cstdio> #include <cstri ...

  8. Markdown 常用语法精讲

    - #### 标题 (`# 跟标题名称一定要留空格`)> > # 一级标题> ## 二级标题> ### 三级标题> #### 四级标题> ##### 五级标题> ...

  9. ceph 009 管理定义crushmap 故障域

    管理和自定义crushmap 定义pg到osd的映射关系 通过crush算法使三副本映射到理想的主机或者机架 更改故障域提高可靠性 pg到osd映射由crush实现 下载时需要将对象从osd搜索到,组 ...

  10. CSS3(一)

    (一)CSS简介 CSS主要用来美化页面.布局页面 1.HTML的局限性 HTML主要是做结构,显示元素内容.只关注内容,但是丑.虽然可以做简单的样式,但是非常臃肿和繁琐 2.CSS网页的美容师 CS ...