【问题标题】:Non-iterative algorithm for 1D game of life一维生命游戏的非迭代算法
【发布时间】:2017-07-08 11:01:48
【问题描述】:

考虑一个布尔数组a[n],其中每个元素都是一个单元格。如果一个且只有一个相邻的单元格还活着,则一个单元格在下一代中变得活跃(设置为true),否则它变成死的(设置为false)。第一个和最后一个单元格被认为是邻居。

给定a[n]、数组大小n和一个正整数t,我希望在第t代进化后计算a[n],但不对t使用任何迭代算法,这可能非常大。

我所观察到的:如果我们将S_k(a[n]) 定义为a[n] 向右移动k 元素的循环移位。也就是说,如果0 <= k < n,则a[0] 在一个班次后变为a[k]。将a[n] ^ b[n] 定义为两个布尔数组之间的逐元素异或运算。如果w[n]是一个布尔数组,则下一代可以表示为

r(w[n]) = S_{-1}(w[n]) ^ S_1(w[n])

xor 运算符^ 是关联和交换的。使用这个属性,接下来的几代w[n]可以通过

r^2(w[n]) = ( S_{-2}(w[n]) ^ S_0(w[n]) ) ^ ( S_0(w[n]) ^ S_2(w[n]) )
          = S_{-2}(w[n]) ^ S_2(w[n])

如果我们让s_j = S_{-j}(w[n]) ^ S_j(w[n]),有一个模式

r(w[n]) = s_1
r^2(w[n]) = s_2
r^3(w[n]) = s_3 ^ s_1
r^4(w[n]) = s_4
...
r(s_m) = s_{m-1} ^ s_{m+1}

此外,s_n = 0(零数组)因为完整的循环移位是原始数组。如何使用它来导出r^t(w[n]) 的非迭代表达式?

编辑:模式是

[1]
[2]
[1,3]
[4]
[3,5]
[2,6]
[1,3,5,7]
[8]

【问题讨论】:

  • 你为什么不想在t 上使用任何迭代算法?即使t非常很大,O(log(t)) 中的迭代算法也会非常有效。

标签: arrays algorithm iteration conways-game-of-life


【解决方案1】:

据我所知,没有像here 所说的那样解决这个游戏的非迭代方法。甚至 'Hashlife' 算法也是迭代的,但有很多辅助记忆。

但是您可以使用一些方法来选择简单的迭代算法:

  • 使用位而不是整数数组:这种方式在某些情况下可以节省大量内存并加快速度。
  • 存储比特的世代:您可以轻松地比较不同世代的比特,以找出世代之间是否存在一些重复模式,在这种情况下,不再需要更多计算。考虑到你只有一个维度,机会可能非常高。

【讨论】:

    【解决方案2】:

    我认为你需要发现更多的模式......

    是不是这样继续下去:

    1
     2 
    1 3
       4
      3 5
     2   6
    1 3 5 7
           8
          7 9
         6   a
        5     b
       4       c
      3   ???   d
     2           e
    1 3 5 7 9 b d f
                   g
    

    如果是这样,最简单的方法似乎是计算 r 以获得最接近的两个

    【讨论】:

    • 是的。模式确实是这样的。这 ???但是,区域不是空的,因为[6,a] 的下一步是[5,7,9,b]。我不知道你说的以前的 2 次方是什么意思。
    • 假设你想去 t=99。如果我正确理解模式,计算应该只有一个术语(s64)的 r^64,然后通过应用 s32 从那里开始计算 r^96,然后是 s2,然后是 s1。它仍然是迭代的,但你循环的是 log(t) 而不是 t。 ——
    【解决方案3】:

    让我们将您的输入表示为列向量a_0,大小为n,包含Z/2Z 的元素。

    您可以使用矩阵乘法计算下一代向量a_1

    a_1 = M.a_0 = |0 1 0 0 ... 0 0 0|  |a_01|
                  |1 0 1 0 ... 0 0 0|  |a_02|
                  |0 1 0 1 ... 0 0 0|  |a_03|
                  ....
                  |0 0 0 0 ... 0 1 0|  |... |
                  |0 0 0 0 ... 1 0 1|  |... |
                  |0 0 0 0 ... 0 1 0|  |a_0n|
    

    鉴于此递归关系,您可以使用以下公式计算时间 t 的生成:

    a_t = M^t . a_0
    

    您可以使用重复平方轻松计算O(n^3.log(t)) 中的M^t

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-03-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-27
      • 1970-01-01
      • 2022-01-16
      • 1970-01-01
      相关资源
      最近更新 更多