在这篇文章中,我们将了解如何在一个排序的二维矩阵中搜索一个特定的元素。
目录:
- 什么是排序的二维矩阵?
- 我们要解决的问题
- 解决问题的方法
- 如何用二进制搜索法来解决问题
- 二元搜索法在现实生活中的应用
- 最后的问题
前提条件:
让我们开始了解如何在一个排序的二维矩阵中搜索一个特定的元素。
什么是排序后的二维矩阵?
在这篇文章中,我们将研究一个按升序排序的二维矩阵(从最小到最大的顺序)。该矩阵将有N个列和M个行。在这个例子中,我们将有一个N=4列、M=3行的二维矩阵。
下面是我们例子中的二维矩阵的直观表示:

从这个图中我们可以看到,每一行的元素都是从最小到最大排序的(从左到右)。我们还可以看到,每一行的第一个元素都比前一行的最后一个元素大。例如,10是第二行的第一个元素,它大于7,后者是前一行的最后一个元素。同样地,23比20大。
我们要解决的问题
我们知道,我们的矩阵是从最小到最大排序的。我们还知道在这个特定的矩阵中,有4行和3列。我们还了解到一种模式,即每行的第一个元素都大于前一行的最后一个元素。我们如何利用到目前为止所知道的知识,在排序后的二维矩阵中找到一个元素?
解决问题的方法
以下是解决这个问题的两种方法:
- 二进制搜索法
如何用二进制搜索法来解决问题
如果将一个像我们上面所说的特定矩阵输入到一个程序中。我们的算法将在这个矩阵中搜索一个特定的目标元素,如果该元素存在则返回真,如果不存在则返回假。为了达到这个目的,我们可以利用一种叫做二进制搜索法的算法。这种方法的时间复杂度为O(log N)。
以下是我们的程序在元素存在或不存在时的样子:
input:
arr[][] = [[1, 3, 5, 7],
[10, 11, 16, 20],
[23, 30, 34, 60]]
target = 41
output: true
explanation: 11 is present in our matrix, therefore we return true.
input:
arr[][] = [[1, 3, 5, 7],
[10, 11, 16, 20],
[23, 30, 34, 60]]
target = 54
output: false
explanation: 54 is not present in out matrix, therefore we return false.
让我们一步一步地完成二进制搜索法:
代码中的注释将提供对所发生的事情的解释。
第1步:检查矩阵是否为空或不可用:
class matrix:
def search_matrix(self, matrix: List[List[int]], target:int)->bool:
if not matrix or not matrix[0]: # if there is no matrix or if the matrix is empty we return false.
return false
第2步:找到我们的行,并将目标值与行中的第一个和最后一个值进行比较:
row = 0 # assume row currently is at 0th index.
# iterate over each row using a range based for loop.
# check if smallest value or greatest value is our target, if it is, return true.
for r in range(len(matrix)):
if target == matrix[r][0] or target == matrix[r][-1]: # r row, 0th value or last value in row (-1)
return True
第3步:检查你的目标是否大于范围:
# check if target is greater than first element of matrix and last element of matrix.
elif target > matrix[r][0] and target < matrix[r][-1]
# if both true
row = r # change row value to r
break
第4步:用二进制搜索法在行中寻找我们的目标元素:
# look for element in row using left(l) and right(r) pointers.
l, r = 0, len(matrix[row]) - 1 # start pointers l and r at 0.
while l <= r: # check if left value is less then or = to right value
# if true, then find mid value
mid = l + (r - 1) // 2
# check if target == mid value
if target == matrix[row][mid]:
return True
# if target is > than mid value
elif target > matrix[row][mid]:
# move left pointer to the right
l = mid + 1
# if target less than mid value
else:
r = mid - 1 # move right pointer to left
return false # if target element not found
二进制搜索法在现实生活中的应用
- 在一个被排序的数组中寻找一个元素。
- 字典,以便找到一个目标词。
- 弄清一个大型系统的资源需求。
- 要在一本书中找到一个特定的页码.
- 在一个排列好的书的集合中找到一个特定的书。
问题
文章中给出的二进制搜索的平均时间复杂度是多少?
O(log N)
O(N^2)
O(N log N)
O(N + K)
文章中给出的平均时间复杂度是O(Log N),因为我们从位置0到最后一个位置遍历矩阵,每个位置只看一次。所以搜索次数取决于矩阵中的层数/行数。
通过OpenGenus的这篇文章,你一定对如何在排序的二维矩阵中搜索一个元素有了深刻的认识。