【发布时间】:2018-09-12 04:47:37
【问题描述】:
给定二维数组a:
let a = [
[0, 0, 1, 0],
[0, 1, 1, 1],
[0, 0, 1, 0],
[0, 0, 1, 1]
]
如何按给定因子对其进行缩放?例如,数组 b 是数组 a 缩放 4:
let b =[
[0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0],
[0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1],
[0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1],
[0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1],
[0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1]
]
这是我为执行此操作而编写的代码,但在处理大型数组 (200 x 200) 时速度很慢(客户端浏览器:Chrome),并且缩放比例为 16。
// scale an array by a factor of 'scale'
const scaledMatrixArray = (arr, scale) => {
let newArr = [];
arr.forEach((el) => {
let newArrRow = [];
el.forEach((el) => {
for (let j = 0; j < scale; j++) {
newArrRow.push(el);
}
});
for(let i = 0; i < scale ; i++) {
newArr.push(newArrRow);
}
});
return newArr;
};
我知道我的实现是 O(n^2) 的一些变体并且效率非常低。我正在寻找一种更好的方法来做到这一点,或者寻找一个做得更好更快的库。我的最终结果是,我的 N X N 数组具有超过 N > 200 可以以最有效、最快且内存占用最少的方式扩展到 800 x 800 的数组。
【问题讨论】:
-
请注意,任何采用
N*N数组并将其缩放某个因子M的实现都会产生总共N*N*M值,因此将是 O(mn^2 ) -
@Hamms 所以没有办法让它更快?
-
取决于你到底想做什么,可能有比制作一个巨大的数组更快/更好的方法
-
如果你真的很在意速度,你可以在任何地方使用
for循环而不是forEach,它在执行大量重复操作时性能提升很小。 -
似乎您可以在 50x50 矩阵上找到路径并将生成的路径点乘以 16。meta.stackexchange.com/questions/66377/what-is-the-xy-problem
标签: javascript arrays algorithm matrix