比较两个大型字符串数组以找出差异?任何有效的算法?

时间:2017-10-18 23:15:41

标签: javascript algorithm set lodash

我有两个字符串数组,如下所示。我想比较两个并获取已更改的行。我目前正在使用lodash来查找差异,但是对于大型数据集(50K行,10列)失败了。我想知道是否有任何有效的算法可以实现,而不是lodash可能使用的强力方法。

var array1 = [
"[1,data,data,data,data]",
"[2,data,data,data,data]",
"[3,data,data,data,data]",
"[4,data,data,data,data]",
];

var array2 = [
"[1,data,data,data,data]",
"[2,data,data2,data,data]",
"[3,data,data,data2,data]",
"[4,data,data,data,data]",
];

我希望该方法返回第2行和第3行,因为数据已更改为data2。

提前感谢您的帮助。

更多信息:   - 字符串中的每个元素都是一列。我忘了提到行代表数据库中的数据,第一个元素是主键。我的用户正在Excel中加载此数据,然后对其进行修改,例如更新数据,插入新行或删除行。我希望能够找出插入,删除或更新的行,以便我只需要更新数据库中的行。目前,我不得不删除数据库中的所有内容并重新插入整个数据集,这显然不是最好的方法。我已经能够使用具有20K行的lodash(每行包含10个元素)来执行此操作,但是lodash无法处理比此更大的数据集。所以我想知道是否有更好的方法来做到这一点。这是我的lodash代码

insertedOrUpdatedRows = _.differenceWith(modifiedData, originalData, _.isEqual);

deletedRows = _.differenceWith(originalData, modifiedData, compareFunction);

function compareFunction(a, b) {
    if(a[0] == b[0]) {
        return true;
    }
    else
        return false;
}

1 个答案:

答案 0 :(得分:2)

假设您的数据已排序,则会在O(n)中进行排序,此外,如果未对其进行排序,您只需对其进行排序即可O(nlogn)。与.filter方法不同,这也考虑了两个数组的长度是否发生了变化,这意味着添加或删除了一个元素。



var array1 = [
  '[1,data,data,data,data]',
  '[2,data,data,data,data]',
  '[3,data,data,data,data]',
  '[4,data,data,data,data]',
];

var array2 = [
  '[1,data,data,data,data]',
  '[2,data,data2,data,data]',
  '[3,data,data,data2,data]',
  '[4,data,data,data,data]',
];

function diff(a1, a2) {
  let p1 = 0;
  let p2 = 0;
  const diff = [];

  for (;;) {
    if (p1 === a1.length && p2 === a2.length) break;
    if (p1 === a1.length) {
      diff.push(a2[p2++]);
      continue;
    }
    if (p2 === a2.length) {
      diff.push(a1[p1++]);
      continue;
    }

    const e1 = a1[p1];
    const e2 = a2[p2];
    if (e1 > e2) {
      p2++;
      diff.push(e2);
    } else if (e1 < e2) {
      p1++;
    } else {
      p1++;
      p2++;
    }
  }

  return diff;
}

console.log(diff(array1, array2))
&#13;
&#13;
&#13;