【问题标题】:Delta encoding - strings (Programming logic - no specific language)Delta 编码 - 字符串(编程逻辑 - 无特定语言)
【发布时间】:2016-07-04 13:17:09
【问题描述】:

任何人都可以将代码用于字符串的增量编码。

例如,如果初始字符串是

“猫和狗”

然后字符串是

“猫和狗”

我应该能够非常有效地获得字符串版本之间的差异。如果有人可以将代码放在这里,那么可以使用非常少的数据使用增量编码发送非常大的段落。

【问题讨论】:

  • 不知道你在问什么。也许你应该谷歌'diff' ..如果这就是你的意思..好吧,这绝不是微不足道的,即使它看起来如此对于人眼!请参阅here 以了解在实现中应该清楚地表明差异没有任何“非常有效”的地方,没有人可以或将“将代码放在这里”..
  • 我正在寻找一种逻辑来构造带有旧字符串和增量的最终字符串(旧版本和新版本之间的差异)。其中 delta 必须可能很小,以便我可以轻松传输大段落。
  • 我找到了答案 Taw,查看答案。

标签: delta


【解决方案1】:

我找到了答案,我想分享给大家。

var oldString = "This is just a sample of string to test the delta encoding. Infact, with my own login.dsfdsfdsfdsfsdfsdfdsfdsfsdfsdfds  dsfds fds fddsf";
var newString = "dsfdsThissdf is just a sample of string to test X the dedsfdsflta encoding sdfds decoding. Infact, with my own sadsadsadsad"
var result = "";

var changes = getChanges(oldString, newString);
var string = getOriginal(oldString, changes);

function getChanges(os, ns) {
    var addedIndex = false;
    var changes = [];
    var obj = [];
    var oi = 0, ni = 0;
    while (oi < oldString.length && ni < newString.length) {
        if (newString.charAt(ni) != oldString.charAt(oi)) {
            if (!addedIndex) {
                obj.push(oi);
                obj.push(newString.charAt(ni));
                addedIndex = true;
            }
            else {
                obj[1] += newString.charAt(ni);
            }
            ni++;
        }
        else {
            if (addedIndex) {
                changes.push(obj);
                obj = [];
                addedIndex = false;
            }
            oi++;
            ni++;
        }
    };
    if (addedIndex) {
        changes.push(obj);
        obj = [];
        addedIndex = false;
    }
    obj = [];
    if (ni == newString.length) {
        obj.push(-1 * oi);
        changes.push(obj);
    }
    if (oi == oldString.length) {
        obj.push(ni);
        obj.push(newString.substring(ni));
        changes.push(obj);
    }
    return changes;
}

function getOriginal(os, changes) {
    var result = os;
    for (var i = changes.length - 1; i >= 0  ; i--) {
        if (changes[i][0] < 0) {
            result = result.substring(0, -1 * changes[i][0]);
        }
        else {
            result = result.substring(0, changes[i][0]) + changes[i][1] + result.substring(changes[i][0]);
        }
    };
    return result;
}

console.log(string);
console.log(newString);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-20
    • 1970-01-01
    相关资源
    最近更新 更多