1. 场景

假设一个系统System在某一时刻的状态可以用State A来表示【State里面包含着一些元素的集合】:

   1: State A = [element_0, element_1,……,element_n]

系统System经过了一段时间的运行,在另一时刻,它的状态变成State B:

   1: State B = [element_0, element_1,……,element_n]

在系统System运行时,会实时生成其中元素变化的日志,日志的内容包含了某个元素的“Add, Delete, Modify”记录。

那么系统System从State A变化到State B,会积累一组变化的日志Diff 1,其中记录了许多条各个元素的变化历史,某一个元素element_n可能会对应到多条的变化记录,比如

   1: [Add, Modify, Delete, Add, Modify, Modify,……]

2. 归纳Diff记录

因此,需要把Diff 1做一个归纳操作,从而得到一个三元组Delta 1,每一项是一个集合,分别保存着“Add”,“Delete”,“Modify”的元素的集合:

   1: Delta 1 = ([Added element 1, Added element 2, ......, Added element n], [Deleted element 1, Deleted element 2, ......, Deleted element n], [Modified element 1, Modified element 2, ......, Modified element n])

分析Diff的记录可以知道,对于一个特定的element,只要知道其在Diff中的第一条记录和最后一条记录,就可以得到它在Diff这段时间内的变化类型

No. First Diff Record Type Last Diff Record Type Summary Change Type
1 Add Add Add
2 Add Delete Temporary
3 Add Modify Add
4 Delete Add Modify
5 Delete Delete Delete
6 Delete Modify Modify
7 Modify Add Modify
8 Modify Delete Delete
9 Modify Modify Modify

3. 多个Diff的归纳三元组的合并

如果我们知道了系统System从State A到State B的Diff归纳后得到的三元组Delta 1,以及系统System从State B到时State C的三元组Delta 2,那么我们怎么能够得到从State A到State C的三元组Delta 3呢?

我们假设

   1: Delta 1 = (Added Set A1, Deleted Set D1, Modified Set M1)

   2: Delta 2 = (Added Set A2, Deleted Set D2, Modified Set M2)

将对应的集合Set进行Union操作

   1: Set A3 = A1 Union A2

   2: Set D3 = D1 Union D2

   3: Set M3 = M1 Union M2

再将A3, D3, M3进行互相的Intersection操作

   1: Set I_AD = A3 Intersection D3

   2: Set I_AM = A3 Intersection M3

   3: Set I_DM = D3 Intersection M3

然后再分别讨论I_AD, I_AM, I_DM中的元素的归属问题:

   1: I_AD: 

   2: A1D2 --> Temporary

   3: D1A2 --> Add[Modify]

   4:  

   5: I_DM:

   6: D1M2 --> [Impossible]

   7: M1D2 --> Delete

   8:  

   9: I_AM:

  10: A1M2 --> Add

  11: M2A2 --> [Impossible]

因此,I_DM中的元素应该归于Delete,而I_AM中的元素应该归于Add,  I_AD中的元素要具体分析其出处才能决定是不是归于Add。

其中,三个圆区域分别代表A3, D3, M3区域;

黑色区域代表不可能出现的情况,红色区域代表集合A4, 绿色区域代表集合D4,而蓝色区域代表集合M4,粉色区域代表可能会属于A4M4的集合(具体取决于是A1D2还是A2D1)。

基于Diff机制的多个状态合并的更多相关文章

  1. redux:基于函数式编程的事件处理和状态维护机制

    redux = monand + pipeline + highorder componet + decouple + middleware redex = store based + event h ...

  2. Android的事件处理机制(一)------基于回调机制的事件处理

    Android平台的事件处理机制有两种,一种是基于回调机制的,一种是基于监听接口的,现介绍第一种:基于回调机制的事件处理.Android平台中,每个View都有自己的处理事件的回调方法,开发人员可以通 ...

  3. Android——事件处理模型一(基于回调机制的事件处理)(转)

    Android平台的事件处理机制有两种,一种是基于回调机制的,一种是基于监听接口的,现介绍第一种:基于回调机制的事件处理.Android平台中,每个View都有自己的处理事件的回调方法,开发人员可以通 ...

  4. Spark练习之wordcount,基于排序机制的wordcount

    Spark练习之wordcount 一.原理及其剖析 二.pom.xml 三.使用Java进行spark的wordcount练习 四.使用scala进行spark的wordcount练习 五.基于排序 ...

  5. 数据分析03 /基于pandas的数据清洗、级联、合并

    数据分析03 /基于pandas的数据清洗.级联.合并 目录 数据分析03 /基于pandas的数据清洗.级联.合并 1. 处理丢失的数据 2. pandas处理空值操作 3. 数据清洗案例 4. 处 ...

  6. React基础(Diff算法,属性和状态)

    1.React的背景原理 (1)React Diff算法流程 (2)React虚拟DOM机制 React引入了虚拟DOM(Virtual DOM)的机制:在浏览器端用Javascript实现了一套DO ...

  7. 基于单细胞测序数据构建细胞状态转换轨迹(cell trajectory)方法总结

    细胞状态转换轨迹构建示意图(Trapnell et al. Nature Biotechnology, 2014) 在各种生物系统中,细胞都会展现出一系列的不同状态(如基因表达的动态变化等),这些状态 ...

  8. 基于token机制鉴权架构

    常见的鉴权方式有两种,一种是基于session,另一种是基于token方式的鉴权,我们来浅谈一下两种 鉴权方式的区别. 两种鉴权方式对比 session 安全性:session是基于cookie进行用 ...

  9. 介绍一种基于gulp对seajs的模块做合并压缩的方式

    之前的项目一直采用grunt来构建,然后用requirejs做模块化,requirejs官方有提供grunt的插件来做压缩合并.现在的项目切到了gulp,模块化用起了seajs,自然而然地也想到了模块 ...

随机推荐

  1. Spring切面编程之AOP

    AOP 是OOP 的延续,是Aspect Oriented Programming 的缩写,意思是面向切面编程.可以通过预编译方式和运行期动态代理实现在不修改源代码的情况下给程序动态统一添加功能的一种 ...

  2. CCNA 之 二 OSI七层模型

    OSI网际互联 OSI的概念 英文全称Open System Interconnect 开放系统互联参数模型,是由ISO国际标准化组织 定义的.它是个灵活的.稳健的和可互操作的模型,并不是协议,使用来 ...

  3. 微信、qq网页二次分享

    二次分享是指,在APP或者浏览器分享到微信或者qq,然后从微信或者qq再分享到别的平台.如果不处理,再次分享出去的图片或者标题就不会显示,对用户非常不友好. 一.微信二次分享 官方接入文档:https ...

  4. 【记录】使用Navicat将表设计导出数据库设计文档

    INFORMATION_SCHEMA. Tables -- 表信息 INFORMATION_SCHEMA. COLUMNS -- 列信息 参考文章地址:https://blog.csdn.net/cx ...

  5. 03.LNMP架构-PHP源码包编译部署详细步骤

    一.环境准备 操作系统:CentOS_Server_7.5_x64_1804.iso 部署组件:yasm+libmcrypt+libvpx+tiff+libpng+freetype+jpeg+libg ...

  6. CS184.1X 计算机图形学导论 HomeWork1

    最容易填写的函数就是left.输入为旋转的角度,当前的eye与up这两个三维向量 void Transform::left(float degrees, vec3& eye, vec3& ...

  7. Sass函数-数字函数-floor()函数

    floor() 函数刚好与 ceil() 函数功能相反,其主要将一个数去除其小数部分,并且不做任何的进位.也就是只做舍,不做入的计算: >> floor(2.1) 2 >> f ...

  8. 使用axios上传文件到阿里云对象文件存储服务器oss

    背景 OSS可用于图片.音视频.日志等海量文件的存储.各种终端设备.Web网站程序.移动应用可以直接向OSS写入或读取数据.OSS支持流式写入和文件写入两种方式.使用阿里云oss做文件存储的时候,不可 ...

  9. vue+element-ui 实现分页(根据el-table内容变换的分页)

    官方例子 官方提示: 设置layout,表示需要显示的内容,用逗号分隔,布局元素会依次显示.prev表示上一页,next为下一页,pager表示页码列表,除此以外还提供了jumper和total,si ...

  10. LOJ6435 PKUSC2018 星际穿越

    这个题吧当时在考场只得了45分 然后70分的性质都分析到了 不知道为啥就是写萎蛋了 哎 当时还是too young too simple 看了一下julao们的博客这个题有两种做法 一个是比较费脑子的 ...