javascript - 为二维数组分配唯一编号的更好方法

标签 javascript arrays multidimensional-array shuffle

我的目标是创建一个二维数组,并在 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/

相关文章:

java - 如何将字符串转换为固定 int 二维数组(特殊情况)?

c - 二维数组不打印正确的输出

Javascript获取多维数组的键

javascript - 如何在Javascript中将两个数组添加到一个数组中

javascript - 在 for 循环中嵌套的 switch 语句中评估 jquery 数组的元素类名称 (javascript/jquery)

javascript - 是否可以在 Kendo UI 线性仪表上仅显示最大/最小值?

javascript - 检查是否支持可选链接

javascript - 使用 javascript 捕获数组并使用数组的值

C++:使用for循环允许用户将数字输入数组

javascript - javascript 判断数组是否包含除指定值之外的任何内容?