让我们的矩阵 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 太大。
答案 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]的正确值:
该算法在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.