我的目标是创建一个二维数组,并在 Javascript 中为每个数组分配一个从 0 到 n 的唯一数字。
例如,如果有 5 行和 5 列,我首先创建一个包含 0 到 24 之间数字的值数组。然后我想对这些数字进行洗牌,然后如果数字小于 10,则放置一个 ' Y' 代表数组中的该点,如果大于或等于 10,则为 'N'。最终结果应该是随机定位的 15 个 N 和 10 个 Y。
我有以下代码可以做到这一点,但我发现它效率很低,并且想知道是否有更好的方法。
//Define Empty Array
test = new Array(rows);
for (var k = 0; k < rows; k++)
{
test[k] = Array(cols);
}
var values = [];
var index = 0;
var maxVals = (rows * cols);
//If maxVals is equal to 25, then the values array will hold "1,2,3,4, ... 24,25"
while(values.push(index++)<maxVals);
//Shuffle all those values so they're no longer in order
var shuffledValues = _.shuffle(values);
var i = 0;
var smallerThan = 10;
for (var x = 0; x < rows; x++)
{
for (var y = 0; y < cols; y++)
{
//Make all the numbers smaller than 10 a Y
if (shuffledValues[i] < smallerThan)
{
test[x][y] = "Y";
}
else
{
test[x][y] = "N";
}
i++;
}
}
最佳答案
因为您需要迭代所有 n = rows×columns
数组中的元素来设置值您的算法已经具有最小时间复杂度 O(n)
。创建索引数组的循环是另一个 n
并且 shuffle 方法(如果正确实现)应该在 n
中进行洗牌同样,所以你的算法已经是 O(3n) = O(n)
。虽然您可以减小常数因子 3,但随着行数和列数的增加,不会产生任何巨大的差异。
如果您不需要确切地确定某个数字为“Y”或“N”,而只需要它们的平均比率,那么您可以这样做:
var ratio = 0.5; //use your required ratio here
for (var x = 0; x < rows; x++)
{
for (var y = 0; y < cols; y++)
{
test[x][y] = Math.random() < ratio ? "Y" : "N";
}
}
关于javascript - 为二维数组分配唯一编号的更好方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25150971/