【发布时间】: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