用于搜索矩阵中的值的算法设计

时间:2011-05-22 21:18:53

标签: algorithm recursion

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

我的教授在课堂上谈了这个问题,但他并没有多说这个问题。以下是问题:

  

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

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

检查第一个元素>项目检查最后一个元素<项目

项目是我想要找到的

这是假想矩阵:( 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

在检查基本情况并确保我想要找到的“项目”在此矩阵的范围内之后,我不知道是否可以从矩阵中的“mid”进行检查(如二进制)搜索)。如果项目<中,然后专注于左半边。如果项目>中间,然后专注于右半部分。

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

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

如果我按照我之前说过的方式:由于10大于中间的“7”,我专注于正确的部分。然后我检查“8”,因为10大于“8”,我搜索右边的部分。但是10不是正确的......

任何人都可以给我一些想法或见解如何解决这个问题?非常感谢

2 个答案:

答案 0 :(得分:5)

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

  1. 如果当前值小于您要搜索的值,请转到右侧。
  2. 如果当前值大于您要搜索的值,请上移。
  3. 如果当前值等于您要搜索的内容,请返回true
  4. 如果您离开矩阵,请返回false
  5. 这是O(n + m),其中nm是矩阵中的行数和列数。这是因为在每一步中,您都完全排除了整行或列。

答案 1 :(得分:0)

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

然而,因为它们已被分类,所以可能不值得添加所有机器。

问题所寻找的解决方案我认为是O(N)解决方案(其中矩阵的大小为N x N);从左上角到左下角到右下角的位置,直到找到大于查询的元素。然后你通过向右上方蠕动来搜索“水平曲线”,每次进行比较,看你是否超调或低于你的查询(向右或向上依赖)。

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