我想建立一个包含位( bool )值的 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。如何创建所有其他立方体来表示每个可能的排列?
最佳答案
在我看来,在这里创建多维数据集的整个概念是多余的,而且 在内存方面非常低效。
当您问“第 N 个 3x3 立方体的位置中的位是什么”时,您实际上在这里问的是:“N 的二进制数字是多少,一个 27 位的数字”。
为此,您不需要存储或计算 任何 - 您只需要对 int
进行位算术(因为 int
是 32 位,而您只需要 27 位)。所以:采用 int n
,并使用位运算符( &
、 |
、 >>
等)的任意组合——就是这样——没有立方体、没有列表、没有任何要存储或预计算的东西——只是 int
的位。处理单个 int
的位是 惊人的 效率 - 甚至比从预先计算的 bool[,,]
中查找它们要便宜得多。并且内存成本实际上为零,而不是预先计算选项的 16GiB。
关于c# - 为每个可能的排列填充 3x3 位立方体,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/55381372/