📜  二维数组的搜索算法(矩阵)(1)

📅  最后修改于: 2023-12-03 15:06:20.330000             🧑  作者: Mango

二维数组的搜索算法(矩阵)

在许多算法场景下,需要对二维数组进行查找操作,而常常使用的算法就是矩阵搜索。本文将介绍矩阵搜索的常见算法和实现方式。

矩阵搜索算法

矩阵搜索算法包括两种基本算法:

  1. 暴力搜索法
  2. 二分搜索法
暴力搜索法

暴力搜索法是最简单,也是最直接的算法。它的基本思路就是依次遍历二维数组的每一个元素,查找是否有目标元素。

具体实现方式如下:

def searchMatrix(matrix, target):
    m = len(matrix)
    n = len(matrix[0])
    for i in range(m):
        for j in range(n):
            if matrix[i][j] == target:
                return True
    return False
二分搜索法

二分搜索法比暴力搜索法更加高效。在二分搜索算法中,将矩阵看作一个一维有序数组来进行查找。这个一维数组的长度是 $m \times n$,数组下标为 $k$ 的元素,对应着矩阵坐标 $(i, j)$,其中 $k = i \times n + j$。因为一维数组有序,可以使用二分搜索来查找目标元素。

具体实现方式如下:

def searchMatrix(matrix, target):
    if len(matrix) == 0:
        return False
    m, n = len(matrix), len(matrix[0])
    left, right = 0, m * n - 1
    while left <= right:
        mid = (left + right) // 2
        row, col = divmod(mid, n)
        if matrix[row][col] == target:
            return True
        elif matrix[row][col] < target:
            left = mid + 1
        else:
            right = mid - 1
    return False
矩阵搜索实例

例如,有一个长度为 $m$ 行,宽度为 $n$ 列的二维数组,如下:

[
[1, 3, 5, 7],
[10, 11, 16, 20],
[23, 30, 34, 60]
]

在该数组中查找元素 3 是否存在。

暴力搜索法查找过程如下:

searchMatrix(matrix, 3) => True

二分搜索法查找过程如下:

searchMatrix(matrix, 3) => True
总结

矩阵搜索算法的实现有两种方法:暴力搜索和二分搜索。暴力搜索法适用于各种类型的二维数组,但速度较慢。二分搜索法适用于经过排序的二维数组,速度更快。