4

给定 2 个数组 [1,2] 和 [7,8] 合并它们以形成 [[1,7], [2,8]] 的最有效方法是什么。我知道我们可以这样做:

a1 = [1,2], a2 = [7,8], a3=[];
for (var i=0; i<a1.length; i++) {
  a3.push([a1[i], a2[i]]);
}

我正在处理一个大数组。所以想看看有没有更好的办法。

4

4 回答 4

7

没有办法比 O(n) 更快地做到这一点,因为每个元素都必须被触摸一次。

于 2012-04-24T07:18:34.910 回答
4

这是个好问题!

首先,确保您a1,a2,a3通过关键字分配给本地范围var,您似乎忘记了。否则性能会受到极大影响。

至于代码性能比较。您可以在此处测试/查看结果:

压缩测试

纯 JavaScript:

var a1 = [1, 2],
  a2 = [7, 8],
  a3 = [];
for (var i = 0; i < a1.length; i++) {
  a3.push([a1[i], a2[i]]);
}

JS/本机方法:

var a1 = [1, 2],
  a2 = [7, 8],
  a3 = [];
a3 = a1.map(function(e, i, a) {
  return [e, a2[i]]
})

当然还有更多可能的实现,但关键是可能没有其他实现可以在O(n)时间内击败 for 循环和直接打包,正如 Travis J 所指出的那样。

引擎/优化:通过Chrome v29 的V8 JavaScript 引擎

于 2013-07-28T17:06:08.467 回答
1

您基本上是在搜索与 Python 的函数相同的zip函数,因此请查看旧 SO 问题的答案:

Javascript 等效于 Python 的 zip 函数

于 2012-04-24T07:19:39.627 回答
0

不,这几乎是最有效的。它在O(n)时间内运行。你真的不能再问了。如果有什么可以优化的,它会将 a1 转换为地图,但这是对内存的优化,听起来你想加快速度。

于 2012-04-24T07:18:57.940 回答