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 - ...
随机推荐
- vue的一些问题
如有不正,请指正! 目录 1.组件化 2.注册组件 a.创建组件构造器 b.注册组件: c.使用组件 3.组件不能访问vue实例上的数据 4.全局组件与局部组件 5.v-model语法糖 组件通信 6 ...
- 我说MySQL联合索引遵循最左前缀匹配原则,面试官让我回去等通知
面试官: 我看你的简历上写着精通MySQL,问你个简单的问题,MySQL联合索引有什么特性? 心想,这还不简单,这不是问到我手心里了吗? 听我给你背一遍八股文! 我: MySQL联合索引遵循最左前缀匹 ...
- Apache DolphinScheduler之最美好的遇见
关于 Apache DolphinScheduler社区 Apache DolphinScheduler(incubator) 于17年在易观数科立项,19年3月开源, 19 年8月进入Apache ...
- java-前端之css
css样式: <!-- 内联样式:在元素的style属性内写样式 --> <h2 style="color: red;">愿你单枪匹马,亦能所向披靡!< ...
- Docke 搭建 apache2 + php8 + MySQL8 环境
Docker 安装 执行 Docker 安装命令 curl -fsSL https://get.docker.com/ | sh 启动 Docker 服务 sudo service docker st ...
- Github文件在线加速下载
众所周知,GitHub是一个巨大的开源宝库,以及程序员和编程爱好者的聚集地,诸多优秀的开源项目全部都是位于GitHub上.但是每当我们看到优秀的开源项目,准备去下(bai)载(piao)时,会发现速度 ...
- windows绕过杀软添加账户密码
windows绕过杀软添加账户密码 起因:system权限下存在杀软无法添加账户信息 绕过方法 1.C#脚本 运行后会在目标机器上创建一个用户为 wh4am1 密码为 qqai@love 的 Admi ...
- Qt QBarSeries简易柱状图教程
博客园最强Qt QBarSeries简易柱状图教程 前情提要 每个人的绘图需求不同,此篇教程也是根据需求来改的.我的需求大概如下所示. 通过信号槽的方式接收signals来刷新柱状图,所以每次触发信号 ...
- Jenkins JNLP方式启动 Agent
Jenkins Server配置 如果你是通过Nginx代理了jenkins,那么需要调整下Nginx的配置 map $http_upgrade $connection_upgrade { defau ...
- 第十三章 k8s的GUI资源管理插件--dashboard
1.部署Kubernetes-dashboard 1.1 准备dashboard镜像 在10.4.7.200上操作 [root@hdss7-200 ~]# docker pull k8scn/kube ...