使用按位XOR运算符直接计算递归中的元素

时间:2017-09-06 16:46:32

标签: matrix mathematical-optimization fractals

让我们的矩阵 MXN 矩阵 A [i] [j] 部分地给出:(以row =开头) 0列= 0):

1)所有 1< = i< = N A [0] [i] = 0

2)所有 0< = j< = M A [j] [0] = 1

矩阵进一步构造A [i] [j]:

对于所有 1< = i< = N 1< = j< = M ,A [i] [j] = A [i-1] [ j] ^ A [i] [j-1],其中^表示按位XOR运算。

如果我想得到一些值A [i] [j],我怎么能直接得到它(没有实际计算A [i] [j]所有1 ... j-1和1 ... i -1)?有模式吗?鉴于 M N 太大。

1 个答案:

答案 0 :(得分:1)

让我们绘制矩阵A的前16行和列:

1000000000000000
1111111111111111
1010101010101010
1100110011001100
1000100010001000
1111000011110000
1010000010100000
1100000011000000
1000000010000000
1111111100000000
1010101000000000
1100110000000000
1000100000000000
1111000000000000
1010000000000000
1100000000000000

你问题的答案"是否存在一种模式"非常清楚"是的!"左上角的8x8子矩阵直接复制到自身下方,也直接复制到右边,除了右边的副本左上角有0而不是1.右下角8x8子矩阵全部为0&#39 ; s,除了左上角有一个1。如果我们只研究前8行和列,就会出现这种完全相同的模式:

10000000
11111111
10101010
11001100
10001000
11110000
10100000
11000000

左上角的4x4子矩阵直接复制到自身下方,也直接复制到右边,除了右边的副本左上角有0而不是1.右下角的4x4子矩阵全部为0& #39; s,除了左上角有1个。

这种递归的自相似性使矩阵A成为分形,与Sierpinski triangle非常相似。

递归自相似性还使我们能够使用i和j的二进制表示来容易地计算A [i] [j]。设B是i或j的二进制表示中设置的最高位。然后,以下过程将返回A [i] [j]的正确值:

  • 表示b = B为0:
    • 如果j = 0,当限制为0到b位时,则返回1(我们在第一列,全是1')
    • 如果i = 0,当限于0到b时,则返回0(我们在第一行)
    • 否则,如果i和j都有一个存储在b中的1,则返回0,除非每个中的所有剩余位都为0,在这种情况下返回1
    • else继续(我们递归到一个较小的子矩阵)

该算法在O(log(max(i,j)))运行时运行,这比天真方法的O(ij)运行时快得多。

让我们看一下这个算法,并举几个例子:

  • A [9] [9] = 0来自上面的矩阵。在二进制表示中,i = 1001且j = 1001.两者在最高有效位中都有1并且在该有效位之后设置了一些位,因此根据上述规则我们返回0.

  • A [9] [3] = 1来自上面的矩阵。在二进制表示中,i = 1001且j = 0011.在最左边(最高有效位),i有1,j有0.因此我们进入下一位(递归),两者都有0.我们再次继续下一位,其中我有一个0而j有一个1.因此我们继续前一位。两者都有1位,后面的所有位都是0&#(由于没有后续位,这很简单),所以我们返回1.

  • A [9] [4] = 1来自上面的矩阵。在二进制表示中,i = 1001且j = 0100.在最左边(最高有效位),i有1,j有0.因此我们进入下一位(递归),其中我有一个0和j有a 1.我们再次进入下一位,其中两者都有0. j在此和所有后续位中都有0,所以我们返回1.

该算法的一个有趣含义是每行k(对于k> 0)具有周期为2 ^ B的重复模式,其中B是行号的二进制表示的最高有效位。例如,行3(二进制表示11)重复1100,而行9(二进制表示1001)重复1111111100000000.这意味着行k的完整重复序列> 1。 0可以用O(k)存储表示,并且可以在O(k log k)时间内通过分别计算j [0,1,...,2 ^ ceiling(log_2 k)的A [k,j]来计算 - 1。