为2D阵列分配唯一编号的更好方法

时间:2014-08-06 01:32:56

标签: javascript arrays multidimensional-array shuffle

我的目标是创建一个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++;
    }
}

1 个答案:

答案 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";
    }
}