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 - ...
随机推荐
- linux 安装 apache+mysql+php
http://www.cnblogs.com/lufangtao/archive/2012/12/30/2839679.html
- Spring源码学习笔记9——构造器注入及其循环依赖
Spring源码学习笔记9--构造器注入及其循环依赖 一丶前言 前面我们分析了spring基于字段的和基于set方法注入的原理,但是没有分析第二常用的注入方式(构造器注入)(第一常用字段注入),并且在 ...
- Python 懂车帝综合口碑数据
本文所有教程及源码.软件仅为技术研究.不涉及计算机信息系统功能的删除.修改.增加.干扰,更不会影响计算机信息系统的正常运行.不得将代码用于非法用途,如侵立删! Python 懂车帝综合口碑数据 需求 ...
- Canvas 笔记目录
Canvas 基础笔记 初次认识 Canvas Canvas 线性图形(一):路径 Canvas 线性图形(二):圆形 Canvas 线性图形(三):曲线 Canvas 线性图形(四):矩形 Canv ...
- iommu分析之---DMA remap框架实现
本文主要介绍iommu的框架.基于4.19.204内核 IOMMU核心框架是管理IOMMU设备的一个通过框架,IOMMU设备通过实现特定的回调函数并将自身注册到IOMMU核心框架中,以此通过IOMMU ...
- 一个dcache的性能问题分析
如何识别并解决复杂的dcache问题 背景:这个是在centos7.6的环境上复现的,但该问题其实在很多内核版本上都有, 如何做好对linux一些缓存的监控和控制,一直是云计算方向的热点,但这些热点 ...
- k8s-Pod基础
制作镜像 第一个pod 搭建Harbor仓库 重启策略 启动命令 pod基本命令 设置环境变量 数据持久化和共享-hostPath 数据持久化和共享-emptyDir JSON格式编写pod文件 Co ...
- 京东云PostgreSQL在GIS场景的应用分享
在地图或地理信息有关的场景里,地址关键词的检索尤其重要.比如打开百度地图,想要查询某个位置的信息"北京市海淀区清华东路17号中国农业大学",往往我们输入的是关键词"中国农 ...
- 利用Hugging Face中的模型进行句子相似性实践
Hugging Face是什么?它作为一个GitHub史上增长最快的AI项目,创始人将它的成功归功于弥补了科学与生产之间的鸿沟.什么意思呢?因为现在很多AI研究者写了大量的论文和开源了大量的代码, ...
- Java开发学习(三十三)----Maven私服(一)私服简介安装与私服分类
一.私服简介 团队开发现状分析 (1)张三负责ssm_crm的开发,自己写了一个ssm_pojo模块,要想使用直接将ssm_pojo安装到本地仓库即可 (2)李四负责ssm_order的开发,需要用到 ...