这个问题不是作业,只是出于个人兴趣,主要是我的好奇心
我的教授在课堂上谈了这个问题,但他并没有多说这个问题。以下是问题:
给定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不是正确的......
任何人都可以给我一些想法或见解如何解决这个问题?非常感谢
答案 0 :(得分:5)
从左下角开始(在您的示例中为3)。
true
。false
。这是O(n + m)
,其中n
和m
是矩阵中的行数和列数。这是因为在每一步中,您都完全排除了整行或列。
答案 1 :(得分:0)
时间最佳解决方案是O(1)
,并且只是使用哈希表跟踪矩阵中的哪些元素。如果空间有问题,也可以使用Bloom过滤器。
然而,因为它们已被分类,所以可能不值得添加所有机器。
问题所寻找的解决方案我认为是O(N)
解决方案(其中矩阵的大小为N
x N
);从左上角到左下角到右下角的位置,直到找到大于查询的元素。然后你通过向右上方蠕动来搜索“水平曲线”,每次进行比较,看你是否超调或低于你的查询(向右或向上依赖)。
您可以考虑的另一种方法是跟踪窗口lower_c
<查询<每列higher_c
c
,从左到右。此窗口的大小始终为2。