(operational-transformations)ot算法两个字符串如何生成ot操作转换的工具

此篇文章写给一同在进行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 友好的区别

代码


```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;
        }
    }

```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文档的部分

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值