基于Diff机制的多个状态合并
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机制的多个状态合并的更多相关文章
- redux:基于函数式编程的事件处理和状态维护机制
redux = monand + pipeline + highorder componet + decouple + middleware redex = store based + event h ...
- Android的事件处理机制(一)------基于回调机制的事件处理
Android平台的事件处理机制有两种,一种是基于回调机制的,一种是基于监听接口的,现介绍第一种:基于回调机制的事件处理.Android平台中,每个View都有自己的处理事件的回调方法,开发人员可以通 ...
- Android——事件处理模型一(基于回调机制的事件处理)(转)
Android平台的事件处理机制有两种,一种是基于回调机制的,一种是基于监听接口的,现介绍第一种:基于回调机制的事件处理.Android平台中,每个View都有自己的处理事件的回调方法,开发人员可以通 ...
- Spark练习之wordcount,基于排序机制的wordcount
Spark练习之wordcount 一.原理及其剖析 二.pom.xml 三.使用Java进行spark的wordcount练习 四.使用scala进行spark的wordcount练习 五.基于排序 ...
- 数据分析03 /基于pandas的数据清洗、级联、合并
数据分析03 /基于pandas的数据清洗.级联.合并 目录 数据分析03 /基于pandas的数据清洗.级联.合并 1. 处理丢失的数据 2. pandas处理空值操作 3. 数据清洗案例 4. 处 ...
- React基础(Diff算法,属性和状态)
1.React的背景原理 (1)React Diff算法流程 (2)React虚拟DOM机制 React引入了虚拟DOM(Virtual DOM)的机制:在浏览器端用Javascript实现了一套DO ...
- 基于单细胞测序数据构建细胞状态转换轨迹(cell trajectory)方法总结
细胞状态转换轨迹构建示意图(Trapnell et al. Nature Biotechnology, 2014) 在各种生物系统中,细胞都会展现出一系列的不同状态(如基因表达的动态变化等),这些状态 ...
- 基于token机制鉴权架构
常见的鉴权方式有两种,一种是基于session,另一种是基于token方式的鉴权,我们来浅谈一下两种 鉴权方式的区别. 两种鉴权方式对比 session 安全性:session是基于cookie进行用 ...
- 介绍一种基于gulp对seajs的模块做合并压缩的方式
之前的项目一直采用grunt来构建,然后用requirejs做模块化,requirejs官方有提供grunt的插件来做压缩合并.现在的项目切到了gulp,模块化用起了seajs,自然而然地也想到了模块 ...
随机推荐
- 重温spark基本原理
(一)spark特点: 1.高效,采用内存存储中间计算结果,并通过并行计算DAG图的优化,减少了不同任务之间的依赖,降低了延迟等待时间. 2.易用,采用函数式编程风格,提供了超过80种不同的Trans ...
- Tarjan(lca)
http://codevs.cn/problem/2370 / 2370 小机房的树 时间限制: 1 s 空间限制: 256000 KB 题目等级 : 钻石 Diamond 题目描 ...
- 32.Group Anagrams(相同元素的不同组合)
Level: Medium 题目描述: Given an array of strings, group anagrams together. Example: Input: ["eat ...
- CSS-02 BFC的理解
两个概念 感觉BFC挺重要的,于是最近查阅网上资料后小结一下,如果有不对的地方还望指正. 先理解两个概念: BOX :盒子模型 Block-Leave Box :块级元素 display属性为bloc ...
- 安卓构架组件——向项目添加组件(Adding Components to your Project)
在开始之前,建议阅读 应用架构指南. Before getting started, we recommend reading the Architecture Components Guide to ...
- MySQL语句优化方法(简单版)
基础回顾: sql语句是怎么样运行的? 一般来说,客户端发送sql语句到数据库服务器——数据库服务器进行运算并返回结果——客户端显示sql语句运行结果. 在本地运行时以workbench为例,客户端为 ...
- 一网打尽 @ExceptionHandler、HandlerExceptionResolver、@controlleradvice 三兄弟!
把 @ExceptionHandler.HandlerExceptionResolver.@controlleradvice 三兄弟放在一起来写更有比较性.这三个东西都是用来处理异常的,但是它们使用的 ...
- javaweb各种框架组合案例(四):maven+spring+springMVC+spring data jpa(hibernate)【失败案例】
一.失败案例 1. 控制台报错信息 严重: Exception sending context initialized event to listener instance of class org. ...
- [SDOI2017]数字表格 (莫比乌斯反演)
链接:https://ac.nowcoder.com/acm/problem/20391来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言52428 ...
- Sass-Opacity函数-rgba()函数
在前面介绍 RGB 函数一节中,还记得吗?有一个 rgba() 函数可以创建一个颜色,同时还可以对颜色修改其透明度.其可以接受两个参数,第一个参数为颜色,第二个参数是你需要设置的颜色透明值. > ...