gpt4 book ai didi

javascript - 获取两个数组之间变化的算法

转载 作者:可可西里 更新时间:2023-11-01 01:34:19 24 4
gpt4 key购买 nike

我需要创建一个算法,该算法将(有效地)获取一个旧数组和一个新数组,并返回两者之间的变化(添加了哪些项目,删除了哪些项目)。它恰好需要使用 JavaScript(以便在浏览器中运行),但算法比语言更重要。

这是我想出的:http://jsbin.com/osewu3/13 .任何人都可以看到任何问题/提出任何改进建议吗?

谢谢!

代码 list :

function diff(o, n) {
// deal with empty lists
if (o == undefined) o = [];
if (n == undefined) n = [];

// sort both arrays (or this won't work)
o.sort(); n.sort();

// don't compare if either list is empty
if (o.length == 0 || n.length == 0) return {added: n, removed: o};

// declare temporary variables
var op = 0; var np = 0;
var a = []; var r = [];

// compare arrays and add to add or remove lists
while (op < o.length && np < n.length) {
if (o[op] < n[np]) {
// push to diff?
r.push(o[op]);
op++;
}
else if (o[op] > n[np]) {
// push to diff?
a.push(n[np]);
np++;
}
else {
op++;np++;
}
}

// add remaining items
if( np < n.length )
a = a.concat(n.slice(np, n.length));
if( op < o.length )
r = r.concat(o.slice(op, o.length));

return {added: a, removed: r};
}

(我也将其发布为另一个 SO 问题的潜在解决方案,此处:JavaScript array difference)

最佳答案

我在两种可能的实现之间创建了一个速度测试。

源代码:

function diff1 (o, n) { 
// deal with empty lists
if (o == undefined) o = [];
if (n == undefined) n = [];

// sort both arrays (or this won't work)
o.sort(); n.sort();

// don't compare if either list is empty
if (o.length == 0 || n.length == 0) return {added: n, removed: o};

// declare temporary variables
var op = 0; var np = 0;
var a = []; var r = [];

// compare arrays and add to add or remove lists
while (op < o.length && np < n.length) {
if (o[op] < n[np]) {
// push to diff?
r.push(o[op]);
op++;
}
else if (o[op] > n[np]) {
// push to diff?
a.push(n[np]);
np++;
}
else {
op++;np++;
}
}

// add remaining items
if( np < n.length )
a = a.concat(n.slice(np, n.length));
if( op < o.length )
r = r.concat(o.slice(op, o.length));

return {added: a, removed: r};
}

function diff2 (o, n) {
// convert array items to object members
var objO = {}, objN = {};
for (var i = 0; i < o.length; i++) {
objO[o[i]] = 1;
}
for (var i = 0; i < n.length; i++) {
objN[n[i]] = 1;
}

var a = []; var r = [];

for (var i in objO) {
if (i in objN) {
delete objN[i];
}
else {
r.push (i);
}
}
for (var i in objN) {
a.push (i);
}
return {added: a, removed: r};
}

var o = [], n = [];
for (var i = 0; i < 300000; i++) {
if (i % 2 == 0) {
o.push (i);
}
if (i % 3 == 0) {
n.push (i);
}
}

var start = new Date ();
diff1 (o, n);
var end1 = new Date ();
diff2 (o, n);
var end2 = new Date ();

alert ((end1 - start) + ", " + (end2 - end1));

diff2 的缺点是返回的数组(添加、删除)没有排序。

速度测试:

IE7:差异 1:2578 毫秒,差异 2:1906 毫秒

IE8:差异 1:1953 毫秒,差异 2:1152 毫秒

Firefox:diff1:254ms,diff2:527ms

Opera:diff1:143ms,diff2:253ms

Safari:diff1:466ms,diff2:657ms

Chrome:差异 1:734 毫秒,差异 2:581 毫秒

结论:diff1 在 Firefox、Opera 和 Safari 中速度更快,diff2 在 IE 和 Chrome 中速度更快。

关于javascript - 获取两个数组之间变化的算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3476672/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com