查找两个矩阵之间的偏移量

时间:2019-06-07 04:18:08

标签: java algorithm matrix

我有2个二进制(r x c)矩阵-相同大小的矩阵A和矩阵B。矩阵B是通过将矩阵A中的1s向左/右/上/下偏移一个偏移值而获得的。

int a[][] ={
            { 0,0,1,0,0 },
            { 0,1,0,1,0 }, 
            { 1,0,0,0,1 }
        }, 
        b[][] = 
        {
            { 0,0,0,1,0 },
            { 0,0,1,0,1 }, 
            { 0,1,0,0,0 }
        }

在这种情况下,矩阵B向右移动了一行。我的目标是找到两个矩阵之间的偏移量(例如r + 1)。

我的解决方案-向矩阵A添加一个全为0的列,并检查其是否等于矩阵B。继续添加c-1列。对行重复相同的过程。当两个矩阵相等时停止。

这似乎是一种非常低效的方法。有更好的方法吗?

1 个答案:

答案 0 :(得分:0)

当前,您的算法的时间复杂度为O(rc ^ 2)。我可以提出一种使用散列的时间复杂度为O(rc)的解决方案。 我将讨论在矩阵右移某些列的情况下如何解决该问题。同样的想法也适用于其他三种类型的班次。需要注意的一件事是,按照我的理解,在您的示例中,第二个矩阵移位了1列,而不是1行,因为所有值都移位了1列。我将在以下解决方案中使用此约定。

让我们假设,我们得到了两个1xc矩阵。现在,我们可以将它们视为具有c位的二进制字符串。我们将对两个字符串进行哈希处理,并使用O(c)内存和O(c)时间存储第二个字符串的所有后缀和第一个字符串的所有前缀的哈希值。现在,我们可以迭代所有可能的移位并检查。例如,要检查矩阵是否移位了3列,我们只需检查第二个字符串的前三个值是否为零,以及第二个字符串的(c-3)长度后缀是否与(c-3)O(1)中第一个字符串的长度前缀。我们需要在开始迭代之前存储第二个字符串的最长零前缀的长度,以使其高效地工作。

现在,当我们有一个rxc矩阵时,我们可以对两个矩阵的每一列进行哈希处理,然后将rxc矩阵转换为1xc字符串,其中字符串的第i个数字将等于第i个的哈希值矩阵的第4列,并以相同方式应用上述算法。