javascript - 重置多维数组的最快方法?

标签 javascript arrays performance algorithm multidimensional-array

假设我有一个二维数组:vectors[x][y],初始数组结构如下所示:

vectors = [    
 [0, 0, 0, 0, 0,],
 [0, 0, 0, 0, 0,],
 [0, 0, 0, 0, 0,],
 [0, 0, 0, 0, 0,],
 [0, 0, 0, 0, 0,]
]

经过一些计算,数组中的数据是随机的。将数组返回到其初始状态的最快和最有效的方法是什么?

我知道我可以对上面的归零数组进行硬编码并再次将向量设置为等于它,但我也知道这样的算法:

for (var x = 0; x < vectors.length; x++) {
    for (var y = 0; y < vectors[x].length; y++) {
        vectors[x][y] = 0;
    }

}

是 O(x * y)。

那么哪种方法更好呢?有没有更好、更快/更有效的方法来解决这个问题?

对于将任意长度的多维数组置零的一般情况,哪种方法最好? (如果重要的话,我正在使用 JavaScript)

最佳答案

这是我的两分钱:

为了获得最快的性能,我会保留原始数组的干净副本。您可以保留引用的硬编码副本

var vectorsOrig = [    
 [0, 0, 0, 0, 0],
 [0, 0, 0, 0, 0],
 [0, 0, 0, 0, 0],
 [0, 0, 0, 0, 0],
 [0, 0, 0, 0, 0]
];

或使用 slice 对初始数组进行动态清理克隆((在您的情况下递归进行深度复制):

var clonedVectors = [0, 0, 0, 0, 0].slice(0);

无论如何,采用将矢量引用重置为原始副本的方法比循环遍历并重置每个节点更快。如果您的旧矢量数组对象不再被引用,JavaScript 将对其进行垃圾回收。

话虽如此,问题就变成了每次都获得一份干净的副本。拥有一次硬编码实例将为您提供一个干净的副本,此后您必须克隆它。您也不想通过与重置选项类似的 for 循环进入动态生成。我的建议是编写一个克隆函数,它只返回一个新的硬编码或初始化数组:

function newVector() {
    return [    
     [0, 0, 0, 0, 0],
     [0, 0, 0, 0, 0],
     [0, 0, 0, 0, 0],
     [0, 0, 0, 0, 0],
     [0, 0, 0, 0, 0]
    ];
}
var vector = newVector();
vector[1][2] = 11;
console.dir(vector);
vector = newVector();  // your old array will be garbage-collected if no longer referenced by any other reference
console.dir(vector);

理想情况下,最好对各种方法进行基准测试。

编辑 感谢 Vega 的投入,我修改了他的测试以测试三种方法。在 Chrome 和 IE9 中,这个解决方案似乎是最快的,在 FF (15.0.1) 中,手动迭代似乎更快(FF 中的内存分配/管理可能更慢)。 http://jsperf.com/array-zero-test/2

关于javascript - 重置多维数组的最快方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13275839/

相关文章:

java - 如何将数组传递给另一个类

javascript - 提高 Highcharts 折线图的性能

javascript - D3.js 分组条形图渲染 x 轴不正确

php - 如何将 html 输入转换为 php 数组

jquery - 获取数组值

performance - 为什么在 Swift 中更新类属性比本地更新慢?

javascript 多重过滤器或条件代码优化

javascript - 传递变量来替换函数

javascript - 检测事件标签是 Chrome 扩展中的一个新标签

javascript - JavaScript 中的 DOM 性能