【问题标题】:Populating 3x3 bit cubes for every possible permutation为每个可能的排列填充 3x3 位立方体
【发布时间】:2019-03-28 04:05:20
【问题描述】:

我想建立一个包含位(布尔)值的 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。如何创建所有其他立方体来表示每个可能的排列?

【问题讨论】:

  • 立方体是定向的吗?
  • 你能澄清一下这个问题吗?创建一些多维数据集很好,但我不清楚任意多维数据集的内容是什么(或者实际上该多维数据集的目的是什么) - 请注意,27 位中有 1.34 亿个排列......现在每个多维数据集大约需要 120 个字节,所以……这是 16 GiB 的数据(你的意思是 9 位吗?)
  • 只需创建一个从0x000 0000 0000 0000 0000 0000 00000x111 1111 1111 1111 1111 1111 1111 的循环,然后为该数字的每一位分配一个立方体结构中的位置。您拥有的每个立方体都可以轻松地用一个数字表示。
  • 你知道那是一亿个立方体,对吧?这听起来像是一个经典的“XY”问题。你有一个真正的问题,你对如何解决它有一个疯狂的想法,现在你要求我们帮助你解决你的疯狂想法。您要解决的真正问题是什么?
  • 另外,您说您正在从 (0,0,0) 迭代到 (3,3,3),但实际上您正在迭代到 (2, 2, 2),这是正确的。跨度>

标签: c#


【解决方案1】:

在我看来,在这里创建立方体的整个概念是多余的,并且在内存方面大量效率低下。

当您问“第 N 个 3x3 立方体的位置中的位是什么”时,您实际上在这里问的是:“N 的二进制数字是什么,一个 27 -位数”。

对于那个,您不需要存储或计算任何东西 - 您只需要对int 进行位运算(因为int 是32 位,你只需要 27)。所以:取int n,并使用按位运算符的任意组合(&amp;|&gt;&gt; 等) - 就是这样 - 没有立方体,没有列表,没有任何东西存储或预计算 - 只是int 的一部分。处理个人 int 的位的效率惊人地 - 甚至比从预先计算的 bool[,,] 中查找它们要便宜得多。而且内存成本实际上是零,而不是预计算选项的 16GiB。

【讨论】:

    【解决方案2】:

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

    000000000000000000000000000 
    100000000000000000000000000 
    010000000000000000000000000 
    ... 
    111111111111111111111111111
    

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

    【讨论】:

      【解决方案3】:

      它很简单 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
      }
      

      【讨论】:

        【解决方案4】:

        以二进制形式迭代从 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);
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2015-11-01
          • 1970-01-01
          • 2018-09-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-01-23
          相关资源
          最近更新 更多