【问题标题】:Find offset between two matrices查找两个矩阵之间的偏移量
【发布时间】:2019-10-22 13:57:32
【问题描述】:

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

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)。

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

这似乎是一种非常低效的方法。有没有更好的方法来做到这一点?

【问题讨论】:

  • 我在这里看到一个需要解释的极端情况。如果给定的矩阵可能有多个等价的移位版本会发生什么?我们如何知道哪种转变是可以接受的?另外,您是否将值从矩阵的末尾包装到开头?
  • 假设我们需要找到任何一种可能的偏移量?而且我没有环绕值(移位时添加一列/行 0)

标签: java algorithm matrix


【解决方案1】:

目前您的算法的时间复杂度为 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 个的哈希值- 矩阵的第 列,并以相同的方式应用上述算法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-08-31
    • 1970-01-01
    • 2020-04-27
    • 1970-01-01
    • 2022-11-21
    • 1970-01-01
    • 2018-07-10
    • 2015-08-28
    相关资源
    最近更新 更多