我想建立一个包含位(布尔)值的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。如何创建所有其他多维数据集来表示每个可能的置换?
答案 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
}