【问题标题】:Algorithm design to search a value in matrix [duplicate]在矩阵中搜索值的算法设计
【发布时间】:2011-08-30 18:08:42
【问题描述】:

这个问题不是作业,只是出于个人兴趣,主要是我的好奇心

我的教授在课堂上讲了一会儿这个问题,但他没有说太多。下面是问题:

给定一个 m x n 矩阵 A,其整数元素沿水平和垂直方向排序 方向分别。我需要开发一个递归程序来搜索查询值是否为 在 A 中。讨论你的设计的时间复杂度。

所以我想了一会儿。我的第一种方法是检查基本情况:第一个元素和最后一个元素

检查是否是第一个元素> item 检查是否最后一个元素

item 是我要找的东西

这是虚矩阵:(x可以是任意数字,但这个矩阵是垂直和水平排序的)

             first     x          x        x         x
                 x     x          x        x         x
                 x     x         mid       x         x
                 x     x          x        x         x
                 x     x          x        x         last

在我检查了基本情况并确保我想要找到的“项目”在这个矩阵的范围内之后,我不知道从矩阵中的“中间”检查是否可以(比如二进制搜索)。如果 item mid,则关注右半部分。

但是,然后我尝试制作一个如下所示的矩阵,我的“项目”是 10

                 1     2          3        4         5
                 2     4          7        8          9
                 3     6          10       11         12

如果我按照我之前说的方式进行:由于 10 大于中间的“7”,因此我将重点放在右侧。然后我检查“8”,因为 10 大于“8”,所以我搜索正确的部分。但是 10 是不对的……

谁能给我一些想法或见解如何解决这个问题?非常感谢

【问题讨论】:

标签: algorithm recursion


【解决方案1】:

时间方面的最佳解决方案是O(1),它只是使用哈希表跟踪矩阵中的哪些元素。如果空间有问题,也可以使用布隆过滤器。

但是,由于它们已排序,因此可能不值得添加所有机器。

我认为问题正在寻找的解决方案是O(N) 解决方案(其中矩阵的大小为NxN);从左上角到左下角到右下角,直到找到比查询更大的元素。然后,您通过向右上角蠕动搜索“水平曲线”,每次执行比较以查看您是否超过或低于您的查询(向右或向上取决于)。

您可以考虑的另一种方法是跟踪窗口lower_c higher_c 的每一列c,从左到右。此窗口的大小始终为 2。

【讨论】:

  • O(1) 真的要搜索 NxN 矩阵吗?
  • @ypercube:是的,它包含在读取矩阵中(或将其加载到内存中,但是您想考虑一下)
【解决方案2】:

从左下角开始(在您的示例中为 3)。

  1. 如果当前值小于您要搜索的值,请向右走。
  2. 如果当前值大于您要搜索的值,则向上。
  3. 如果当前值等于您要搜索的值,则返回 true
  4. 如果您超出矩阵,请返回false

这是O(n + m),其中nm 是矩阵中的行数和列数。这是因为在每个步骤中,您都完全排除了整行或整列。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-09-26
    • 2016-08-26
    • 1970-01-01
    • 2011-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多