在行和列排序的矩阵中搜索2025年3月17日 | 阅读 7 分钟 引言搜索矩阵中的元素是许多应用程序(从图像处理到数据库)的基本计算机科学问题。当面对一个在行和列上都已排序的矩阵时,我们可以使用更复杂的搜索技术来最大化效率。我们将探讨在行和列排序的矩阵中进行搜索的复杂性,并考察简单和复杂的算法以找到最佳解决方案。 考虑一个二维矩阵,其中每一行和每一列都按升序排列。这种特殊的结构提供了丰富的探索机会和挑战,需要创造性的搜索算法。在这样的矩阵中,传统的搜索技术(如线性搜索)效率低下。因此,开发人员会采用更高级的技术来利用矩阵的排序特性。 行和列排序的矩阵中搜索的算法从矩阵的右上角开始 从矩阵的右上角元素开始搜索。选择这个角落的原因是它可以有效地根据目标值剔除行或列。 如果找到匹配元素,则返回其位置 检查目标值是否与矩阵中的当前元素匹配。如果匹配,则找到了目标的位置,搜索成功。要么将位置标记为找到,要么返回它。 如果当前元素大于目标,则向左移动 如果当前元素大于目标,则意味着该列中的所有元素都大于目标。为了在同一行中查找较小的值,向左移动。 如果当前元素小于目标值,则向下移动 如果当前元素小于目标值,则意味着该行中的所有元素都小于目标值。为了在同一列中查找较大的值,向下移动。 重复步骤 2-4,直到找到目标或超出边界 重复步骤 2 到 4,直到找到目标或搜索无效。到达矩阵的左边缘或底边缘意味着目标不在矩阵中,这称为越界。 蛮力法在矩阵中查找目标元素的简单技术是蛮力法。此方法涉及逐一遍历矩阵中的每个元素,直到找到目标。虽然此方法的时间复杂度为 O(m * n),其中 m 是行数,n 是列数,但存在更有效的方法,尤其适用于大型矩阵。 代码 输出 ![]() 代码解释 searchMatrixBruteForce 函数
主函数 (main)
蛮力法(searchMatrixBruteForce) searchMatrixBruteForce 函数使用嵌套循环遍历矩阵的每个元素。它检查目标值是否与当前元素相等。如果找到匹配项,函数返回 1,表示目标在矩阵中。如果在遍历整个矩阵后未找到匹配项,则函数返回 0,表示目标不存在。 时间复杂度 searchMatrixBruteForce 函数的时间复杂度为 O(m * n),其中 m 表示矩阵的行数,n 表示矩阵的列数。这是因为代码使用嵌套循环遍历矩阵的每个元素,在最坏的情况下需要检查每个元素。 空间复杂度 无论输入大小如何,该算法只需要固定的额外空间;因此,空间复杂度为 O(1)。仅使用目标、结果和循环计数器(i 和 j)等变量。这些变量所需的空间量是恒定的,并且不会随着输入矩阵的大小而增加。 二分查找法 在行和列都排序的矩阵中查找元素提供了不同的可能性和挑战。虽然蛮力法可能很简单,但在处理大型矩阵时效率可能不高。这时二分查找法可以提供一种利用矩阵排序结构的优化解决方案。二分查找是一种经典的算法技术,通过反复将搜索空间分成两半来高效地查找排序集合中的目标元素。当应用于行和列排序的矩阵时,二分查找可以大大减少所需的比较次数,从而实现 O(m + n) 的时间复杂度,其中 m 是行数,n 是列数。 二分查找在排序矩阵中的工作原理初始化指针: 应通过将指针设置为矩阵的右上角或任何其他合理的起始点来初始化指针。例如,将 col 设置为 cols - 1,将 row 设置为 0。 与目标进行比较: 将目标与当前位置的元素进行比较。 调整指针: 根据比较结果,通过向左移动(如果当前元素大于目标)或向下移动(如果当前元素小于目标)来调整指针。 重复: 重复步骤 2 和 3,直到找到目标或指针越过边界。 代码 输出 ![]() 代码解释 函数(searchMatrixBinary)定义
设置主函数
函数调用(searchMatrixBinary)
输出
时间复杂度 该代码的时间复杂度为 O(m + n),其中 m 表示矩阵的行数,n 表示矩阵的列数。这是因为在 while 循环的每次迭代中,根据目标与当前矩阵元素的比较结果,会剔除一行或一列。在最坏的情况下,算法只会遍历每一行和每一列一次,从而得到线性时间复杂度。 空间复杂度 该代码的空间复杂度为 O(1)。无论输入矩阵的大小如何,算法使用的空间量始终相同。仅使用用于索引(row 和 col)和当前元素(currentElement)的整数变量。该算法不使用任何与输入大小成比例的额外数据结构;相反,这些变量占用恒定的空间。 下一个主题SIP Stack |
我们请求您订阅我们的新闻通讯以获取最新更新。