实现一个CRDT工具库——PSet
PSet
这段代码实现了一个PSet,即Positive Set,是GSet的扩展。PSet是一个集合,支持添加和删除元素,但是不支持重复元素。PSet的实现是通过两个GSet来实现的,一个GSet存储添加的元素,另一个GSet存储删除的元素。value函数返回PSet中的元素,add函数向PSet中添加元素,rem函数从PSet中删除元素,merge函数将两个PSet合并。其中,GSet是一个Grow-only Set,即只支持添加元素,不支持删除和修改元素。
PSet是一个集合,支持添加和删除元素,但是不支持重复元素。下面是各个函数的功能:
- PSet():创建一个空的PSet。
- zero():创建一个空的PSet。
- value(a: PSet):返回PSet中的元素。
- add(a: PSet, value):向PSet中添加元素。
- rem(a: PSet, value):从PSet中删除元素。
- merge(a: PSet, b: PSet):将两个PSet合并。
import GSet
def PSet():
return (GSet.zero(), GSet.zero())
def zero():
return PSet()
def value(a: PSet):
add, rem = a
return add - rem
def add(a: PSet, value):
add, rem = a
return add.add(value)
def rem(a: PSet, value):
add, rem = a
return rem.add(value)
def merge(a: PSet, b: PSet):
add_a, rem_a = a
add_b, rem_b = b
return (GSet.merge(add_a, add_b), GSet.merge(rem_a, rem_b))
import java.util.HashSet;
import java.util.Set;
public class PSet {
public static Set<Integer> value(PSetTuple a) {
Set<Integer> add = GSet.value(a.add);
Set<Integer> rem = GSet.value(a.rem);
Set<Integer> res = new HashSet<>(add);
res.removeAll(rem);
return res;
}
public static PSetTuple add(PSetTuple a, int value) {
Set<Integer> add = GSet.add(a.add, value);
Set<Integer> rem = a.rem;
return new PSetTuple(add, rem);
}
public static PSetTuple rem(PSetTuple a, int value) {
Set<Integer> add = a.add;
Set<Integer> rem = GSet.add(a.rem, value);
return new PSetTuple(add, rem);
}
public static PSetTuple merge(PSetTuple a, PSetTuple b) {
Set<Integer> add_a = a.add;
Set<Integer> rem_a = a.rem;
Set<Integer> add_b = b.add;
Set<Integer> rem_b = b.rem;
Set<Integer> add = GSet.merge(add_a, add_b);
Set<Integer> rem = GSet.merge(rem_a, rem_b);
return new PSetTuple(add, rem);
}
public static PSetTuple zero() {
return new PSetTuple(GSet.zero(), GSet.zero());
}
public static class PSetTuple {
public Set<Integer> add;
public Set<Integer> rem;
public PSetTuple(Set<Integer> add, Set<Integer> rem) {
this.add = add;
this.rem = rem;
}
}
}
class GSet {
public static Set<Integer> value(Set<Integer> a) {
return a;
}
public static Set<Integer> add(Set<Integer> a, int value) {
Set<Integer> res = new HashSet<>(a);
res.add(value);
return res;
}
public static Set<Integer> merge(Set<Integer> a, Set<Integer> b) {
Set<Integer> res = new HashSet<>(a);
res.addAll(b);
return res;
}
public static Set<Integer> zero() {
return new HashSet<>();
}
}
实现一个CRDT工具库——PSet的更多相关文章
- 如何手写一个js工具库?同时发布到npm上
自从工作以来,写项目的时候经常需要手写一些方法和引入一些js库 JS基础又十分重要,于是就萌生出自己创建一个JS工具库并发布到npm上的想法 于是就创建了一个名为learnjts的项目,在空余时间也写 ...
- [js高手之路] 跟GhostWu一起封装一个字符串工具库-架构篇(1)
所谓字符串工具库就是利用javascript面向对象的知识封装一个常用的字符串处理方法库,首先给这个库起个名字,好吧就叫ghostwu.js. 看下ghostwu.js的整体架构: ; (functi ...
- [js高手之路] 跟GhostWu一起封装一个字符串工具库-扩展trim,trimLeft,trimRight方法(2)
我们接着上一篇的继续,在上一篇我们完成了工具库的架构,本文扩展字符串去空格的方法, 一共有3个 1,trimLeft: 去除字符串左边的空格 2,trimRight: 去除字符串右边的空格 3,tri ...
- [js高手之路] 跟GhostWu一起封装一个字符串工具库-扩展字符串位置方法(4)
本文,我们接着之前的框架继续扩展,这次扩展了一共有5个与字符串位置相关的方法 between( left, right ) 返回两个字符串之间的内容, 如果第二个参数没有传递,返回的是找到的第一个参数 ...
- [js高手之路] 跟GhostWu一起封装一个字符串工具库-扩展camelize与dasherize方法(3)
在此之前,我们已经完成了4个方法: trimLeft, trimRight, trim, capitalize 本文,我们扩展驼峰式与下划线转化这两个对称的方法 camelize: 把空格,下划线,中 ...
- 一个PHP高性能、多并发、restful的工具库(基于multi_curl)
This is high performance curl wrapper written in pure PHP. It's compatible with PHP 5.4+ and HHVM. N ...
- Underscore.js工具库
Underscore 是一个 JavaScript 工具库,它提供了一整套函数式编程的实用功能,但是没有扩展任何 JavaScript 内置对象. 他解决了这个问题:“如果我面对一个空白的 HTML ...
- JavaScript工具库
jPublic 交流QQ群:1017567122 前言 在我们开发项目的时候,无论项目规模大小,在所难免会写一些工具型函数来解决一些问题,随着项目开发和维护的时间越来越长,这些工具型函数会越来越多,同 ...
- 手把手教你使用Rollup打包📦并发布自己的工具库🔧
DevUI是一支兼具设计视角和工程视角的团队,服务于华为云DevCloud平台和华为内部数个中后台系统,服务于设计师和前端工程师. 官方网站:devui.design Ng组件库:ng-devui(欢 ...
- 自己的一个LESS工具函数库
自己大概在一年前开始使用LESS编写样式,现在感觉不用LESS都不会写样式了.现在写静态页面完全离不开LESS与Zen Coding,我可以不用什么IDE,但这两个工具却必须要,当然也强烈推荐看到这篇 ...
随机推荐
- Linux文本文件及处理工具
Linux中的文本信息 文本文件 C语言,Java语言等编程文件的源程序语言 文本格式的数据文件 文本格式的文字信息 在Linux下一切皆文件 everything is file,包括目录也是文件的 ...
- curl下载远程图片到服务器
<?php //curl下载远程图片到服务器 方法 function download($url, $path = 'images/'){ $ch = curl_init(); $names = ...
- 基础实验之访问控制列表ACL应用
要求: 1,PC1,PC2,PC3互通 2,配置ACL限制PC2不能访问PC3 1,首先规划好IP,配置如上图 SW2配置 # vlan batch 10 20 # interface Vlanif ...
- CSS 层叠式-理解层叠性和继承性
CSS的概念中,除了前面提到的样式外,还有一个重要的概念就是层叠式,层叠式是贯穿整个css的一个性质,包含继承性和层叠性. 继承性: • 如果一个标签没有设置过一些样式,它的某个祖先级曾经设置过,在浏 ...
- 字符串替换Replace仅替换第一个匹配项
C#里面的String.Replace(string,string)方法替换的时候是替换所有的匹配项,但是有时候我们会遇到这样的需求,就是只替换第一个匹配项. 我这里自己写另一个方法来实现这个功能,求 ...
- vue中的普通函数与箭头函数以及this关键字
普通函数 普通函数指的是用function定义的函数 var hello = function () { console.log("Hello, Fundebug!"); } 箭头 ...
- JavaScript 字符串和正则相关的方法
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- 第3章---数据探索(python数据挖掘)
1.缺失值分析及箱型图 数据:catering_sale.xls(餐饮日销额数) 缺失值使用函数:describe()函数,能算出数据集的八个统计量 import pandas as pd cater ...
- AtCoder-abc230_g GCD Permutation 容斥
J - GCD Permutation 传送门: J - GCD Permutation 知识点:素数筛.容斥定理.gcd 题意:长度为n的一个排列a中,求满足\(gcd(i,j)!=1 且 gcd( ...
- 2020.11.24 javaScript匿名函数的使用
参考链接:http://www.voidcn.com/article/p-ngxxuegm-bmv.html 匿名函数: 函数表达式中创建的函数叫做匿名函数,也就是没有函数名的函数. 自执行函数: 创 ...