我的目标是创建一个2D数组,并在Javascript中为每个数组分配一个0到n的唯一数字。
例如,如果有5行和5个col,我首先创建一个包含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++;
}
}
答案 0 :(得分:1)
由于您需要迭代数组中的所有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";
}
}