为每个可能的排列填充3x3位多维数据集

时间:2019-03-27 15:49:27

标签: c#

我想建立一个包含位(布尔)值的3x3多维数据集的集合。我希望集合包含值的所有可能组合。因此,对于27位,每个可能的组合都将打开或关闭每个位。

var dimension = 3;
var cubes = new List<bool[,,]>();

// iterate from (0,0,0) to (3,3,3)
var cube = new bool[dimension, dimension, dimension];
for (int i = 0; i < dimension; i++)
{
    for (int j = 0; j < dimension; j++)
    {
        for (int k = 0; k < dimension; k++)
        {
            cube[i, j, k] = true;
        }
    }
}
cubes.Add(cube);

这将创建一个单个多维数据集,其中每个单元格都设置为true。如何创建所有其他多维数据集来表示每个可能的置换?

4 个答案:

答案 0 :(得分:5)

在我看来,在此处创建多维数据集的整个概念是多余的,并且在内存方面大量无效。

当您问“第N个3x3多维数据集的位置上的位是什么”时,您实际上在问的是:“ N的二进制数是多少,即27位数字”。

对于那个,您不需要存储或计算任何内容-您只需要对int进行位算术(因为{{ 1}}是32位,您只需要27)。因此:采用int,并使用按位运算符(int n&|等的任意组合)-就是这样-没有多维数据集,没有列表,没有任何要存储或预先计算的内容-只是>>的一部分。使用int的各个位的工作效率惊人地-比从预先计算的int查找它们要便宜得多。而且内存成本实际上为零,而不是预计算选项的16GiB。

答案 1 :(得分:1)

首先,您可以生成27位的排列。 例如

000000000000000000000000000 
100000000000000000000000000 
010000000000000000000000000 
... 
111111111111111111111111111

之后,您只需要将这些排列分配给多维数据集的值即可。

答案 2 :(得分:0)

用二进制表示法从0到111111111111111111111111111的所有值进行迭代。并将适当的值放在单元格中。

private void SetCubeValue(bool[, , ] cube, int dimension, int value)
{
    var bitArray = new BitArray(BitConverter.GetBytes(value));

    int dimensionX2 = dimension*dimension;
    int dimensionX3 = dimensionX2*dimension;

    for (int i = 0; i < dimensionX3; ++i)
    {
        int x = i / dimensionX2;
        int y = (i - x* dimensionX2) / dimension;
        int z = i -  x* dimensionX2 - y*dimension;

        if (i < bitArray.Length && bitArray[i])
            cube[x, y, z] = true;
    }
}
var dimension = 3;
var cubes = new List<bool[,,]>();

for (var i = 0; i < 134217727; ++i)
{
    var cube = new bool[dimension, dimension, dimension];
    SetCubeValue(cube, dimension, i);
    cubes.Add(cube);
}

答案 3 :(得分:0)

这很简单bin 0是dec 0 bin 111111111111111111111111111是dec 134217272,因此您必须创建一个从0到134217272的循环,并使用Convert.ToString(value,2)将数字存储为二进制。 因为不是很清楚所需的输出格式,请尝试以下操作:

for( var i = 0; i < 134217727; i++)
{
   var strBin = Convert.ToString( i,2);
   // Do whatever you want with strbin
}