ot算法两个字符串如何生成ot操作转换的工具

(operational-transformations)
此篇文章写给一同在进行ot算法实践中的朋友们,希望抛砖引玉,有对ot算法感兴趣的小伙伴可以联系我一下,目前关于此算法的一些细节处理上我还有一点点的疑惑部分,希望能讨论解决

Purpose 目的

在目前的ot算法中,您并不知道两个字符串是如何将一个字符串转换为第二个字符串的,在使用操作转换(operational-transformations,OT)时,您必须知道文本块何时被插入、删除或替换。您只处理字符串中的连续更改(连续意味着所有更改都在一起)。从来没有超过一组的变化) 即可。

Here’s an example:

下面是一个例子:

contiguous changes (what OT handles)

string -> strings # insertion
strings -> string # deletion
string -> strong # replacement

non-contiguous changes (what OT can’t handle)

string -> things
This library exists to give you OT-friendly diffs between two strings.

这个方法的存在是为了在两个字符串之间提供对 ot 友好的区别

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30

```javascript
// 字符串转换 (后字符一定是前字符演变的)
function stringConversion(preCharacter,lastCharacter){
let textOperation1 = ot.TextOperation();
let jiao = compareStrings(preCharacter,lastCharacter);
jiao = jiao.join("");
// 有交集
if((jiao.length>0) && (preCharacter!=lastCharacter)){

// 有交集,前者获取到交集的下角标开始和结尾,将0和下角标开始删除,在新增后者交集的0到开始的字符串,跳过交集字符串length,在从前者结尾删除,
// 一直到结尾,在新增一个后者结尾到最后的参数即可
let preStartSubscript = preCharacter.indexOf(jiao);
let preEndSubscript = (preCharacter.indexOf(jiao)+jiao.length)-1;
let endStartSubscript = lastCharacter.indexOf(jiao);
let endEndSubscript = (lastCharacter.indexOf(jiao)+jiao.length)-1;

textOperation1.delete(preCharacter.substring(0,preStartSubscript));
textOperation1.insert(lastCharacter.substring(0,endStartSubscript));
textOperation1.retain(jiao.length);
textOperation1.delete(preCharacter.substring(preEndSubscript,preCharacter.length-1));
textOperation1.insert(lastCharacter.substring(endEndSubscript+1,lastCharacter.length));
return textOperation1;
}else if (preCharacter == lastCharacter){
return null;
}else {
textOperation1.delete(preCharacter).insert(lastCharacter);
return textOperation1;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

```javascript
// 获取两者交集
const compareStrings = function (A, B) {
let a = A.split("");
let b = B.split("");
//求得a,b两个数组的交集
let jiao = "";
if(b.length == 0){
return b;
}
return a.map(function (val) {
jiao += val;
if(B.indexOf(jiao) != -1){
return val;
}
});
};

解释

第一个是主方法

第二个是获取两个字符串交集的部分

这个算法应该还有可优化的部分,代码比较凌乱,各位海涵,最近在写共同协作的markdown文档的部分