Matrix 用位异或算子直接计算递归中的元素

Matrix 用位异或算子直接计算递归中的元素,matrix,mathematical-optimization,fractals,Matrix,Mathematical Optimization,Fractals,让我们有一个矩阵mxn矩阵a[i][j]部分给定为:(从行=0开始,列=0): 1) 对于所有1让我们绘制出矩阵A的前16行和列: 1000000000000000 1111111111111111 1010101010101010 1100110011001100 1000100010001000 1111000011110000 1010000010100000 1100000011000000 1000000010000000 1111111100000000 10101010000000

让我们有一个矩阵mxn矩阵a[i][j]部分给定为:(从行=0开始,列=0):


1) 对于所有1让我们绘制出矩阵A的前16行和列:

1000000000000000
1111111111111111
1010101010101010
1100110011001100
1000100010001000
1111000011110000
1010000010100000
1100000011000000
1000000010000000
1111111100000000
1010101000000000
1100110000000000
1000100000000000
1111000000000000
1010000000000000
1100000000000000
您的问题“是否存在模式”的答案很明显是“是!”左上角的8x8子矩阵直接复制到其自身下方,也直接复制到右侧,但右侧的副本在其左上角有一个0,而不是一个1。右下角的8x8子矩阵除了左上角有一个1外,其余都是0。如果我们只研究前8行和前8列,就会出现完全相同的模式:

10000000
11111111
10101010
11001100
10001000
11110000
10100000
11000000
左上角的4x4子矩阵直接复制到其自身下方,也直接复制到右侧,但右侧的副本在其左上角有一个0,而不是一个1。右下角的4x4子矩阵除了左上角有一个1之外都是0

这种递归自相似性使矩阵成为分形,非常类似于

递归自相似性还使我们能够使用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
    • 否则继续(我们递归到更小的子矩阵)
该算法运行在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。我们再次进入下一位,其中i有一个0,j有一个1。因此,我们进入最后一点。两者的位中都有一个1,后面所有的位都是0(这是非常正确的,因为没有后面的位),所以我们返回1

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


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

谢谢您的回答,实际上,如果我已经计算了前几行,那么我想要得到一整行,这样我就可以从O(logn)中的预计算行计算任何一行了?这可能吗?因为我看到任何一行都表示X与行X-2^(最大幂为2)非常相似。@mahendersingh如果你想计算行k的前n个元素,那么不管你选择什么方法,你至少需要O(n)个时间。如果您使用我的答案中的方法分别计算每个元素,您将能够在O(n log(max(n,k)))运行时进行计算,这应该仍然非常快。我感谢您的回答,但我有很多查询,不是获取该特定行的每个元素,而是说我需要该特定行的所有元素的总和或xor,那我不能更有效地做吗?请仔细阅读我以前的文章comment@mahendersingh我看不出有比这更容易/更快的方法。很抱歉同样,如果您想计算一行中的n个元素,那么按照您的要求在O(log(n))运行时中这样做是没有希望的——只需编写输出值就需要O(n)个工作。我在这里发布的解决方案实际上并不比O(n)慢多少。@mahendersingh我添加了一条关于计算给定行的重复模式的注释。我希望这有助于解决你的问题。