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

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

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

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

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

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


部分持久和完全持久

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

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

复制后重写

创建持久数据结构的一种方法是使用平台提供的临时数据结构(如数组)将数据存储在数据结构中,并使用写入时复制语义复制整个数据结构,以便对数据结构进行任何更新。这是一种低效的技术,因为每次写入都必须复制整个后备数据结构,从而导致对大小为 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. V8中的快慢数组(附源码、图文更易理解😃)

    接上一篇掘金 V8 中的快慢属性,本篇分析V8 中的快慢数组,了解数组全填充还是带孔.快慢数组.快慢转化.动态扩缩容等等.其实很多语言底层都采用类似的处理方式,比如:Golang中切片的append操 ...

  2. 用JavaScript写一个能开始和暂停的时钟

    //sScriptvar showTime = document.getElementById('seconds') var id =0 function fn(){ var i = 0 var s ...

  3. Auto.js 调用系统短信、电话

    本文所有教程及源码.软件仅为技术研究.不涉及计算机信息系统功能的删除.修改.增加.干扰,更不会影响计算机信息系统的正常运行.不得将代码用于非法用途,如侵立删! Auto.js 调用系统短信.电话 操作 ...

  4. SmartIDE v1.0.23 一个非常不敏捷的发布

    SmartIDE v1.0版本(CLI Build v1.0.23.4650,Server Build v1.0.23.4646)已经发布,在超过4000 个 Builds 之后,我们终于发布了v1. ...

  5. 【原创】Asp.NET Core Web API与Vue 3.0搭建前后分离项目

    特地记录一下,网上的教程写的稀里糊涂的,整得我都心塞塞的,其实实现的过程蛮简单的 问题是这样的:我将Vue构建生成好的文件,放在后端wwwroot文件里面,并开启静态文件访问功能,结果总是无法显示相应 ...

  6. nginx代理与反向代理原理

    简介: nginx是一个http服务器,稳定性好,底层由c编写,一个高性能的http 服务器/反向代理服务器及电子邮件代理服务器. nginx可以做web服务器,也可以做网关,主要应用于代理和方向代理 ...

  7. [极客大挑战 2019]HardSQL-1

    1.打开之后万能密码等均被过滤,那就先确定下过滤的内容,采用brup抓包进行爆破,发现对union进行了过滤,因此这里就没法使用联合注入,结果如下: 爆破得字典: ^ & && ...

  8. LuoguP1858 多人背包(DP)

    第\(K\)优解这类问题可在\(DP\)过程中通过添维解决.归并出当前前\(K\)大的解. #include <iostream> #include <cstdio> #inc ...

  9. mybatis 10: 动态sql --- part2

    < foreach >标签 作用 用来进行循环遍历,完成循环条件的查询,批量删除,批量增加,批量更新 用法 循环查询 + 批量删除 + 批量增加 + 批量更新 UsersMapper.ja ...

  10. [跨数据库、微服务] FreeSql 分布式事务 TCC/Saga 编排重要性

    前言 FreeSql 支持 MySql/SqlServer/PostgreSQL/Oracle/Sqlite/Firebird/达梦/Gbase/神通/人大金仓/翰高/Clickhouse/MsAcc ...