如何在一个排序的二维矩阵中搜索一个特定的元素

246 阅读4分钟

在这篇文章中,我们将了解如何在一个排序的二维矩阵中搜索一个特定的元素。

目录:

  1. 什么是排序的二维矩阵?
  2. 我们要解决的问题
  3. 解决问题的方法
  4. 如何用二进制搜索法来解决问题
  5. 二元搜索法在现实生活中的应用
  6. 最后的问题

前提条件:

让我们开始了解如何在一个排序的二维矩阵中搜索一个特定的元素。

什么是排序后的二维矩阵?

在这篇文章中,我们将研究一个按升序排序的二维矩阵(从最小到最大的顺序)。该矩阵将有N个列和M个行。在这个例子中,我们将有一个N=4列、M=3行的二维矩阵。

下面是我们例子中的二维矩阵的直观表示:

Untitled-drawing

从这个图中我们可以看到,每一行的元素都是从最小到最大排序的(从左到右)。我们还可以看到,每一行的第一个元素都比前一行的最后一个元素大。例如,10是第二行的第一个元素,它大于7,后者是前一行的最后一个元素。同样地,23比20大。

我们要解决的问题

我们知道,我们的矩阵是从最小到最大排序的。我们还知道在这个特定的矩阵中,有4行和3列。我们还了解到一种模式,即每行的第一个元素都大于前一行的最后一个元素。我们如何利用到目前为止所知道的知识,在排序后的二维矩阵中找到一个元素?

解决问题的方法

以下是解决这个问题的两种方法:

  1. 二进制搜索法

如何用二进制搜索法来解决问题

如果将一个像我们上面所说的特定矩阵输入到一个程序中。我们的算法将在这个矩阵中搜索一个特定的目标元素,如果该元素存在则返回真,如果不存在则返回假。为了达到这个目的,我们可以利用一种叫做二进制搜索法的算法。这种方法的时间复杂度为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 
        

二进制搜索法在现实生活中的应用

  1. 在一个被排序的数组中寻找一个元素。
  2. 字典,以便找到一个目标词。
  3. 弄清一个大型系统的资源需求。
  4. 要在一本书中找到一个特定的页码.
  5. 在一个排列好的书的集合中找到一个特定的书。

问题

文章中给出的二进制搜索的平均时间复杂度是多少?

O(log N)

O(N^2)

O(N log N)

O(N + K)

文章中给出的平均时间复杂度是O(Log N),因为我们从位置0到最后一个位置遍历矩阵,每个位置只看一次。所以搜索次数取决于矩阵中的层数/行数。

通过OpenGenus的这篇文章,你一定对如何在排序的二维矩阵中搜索一个元素有了深刻的认识。