📜  在C ++中按地图中的值搜索(1)

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

在C ++ 中按地图中的值搜索

在编程中,常常需要在数据集合中进行搜索操作。一个常见的情况是搜索一个二维数组中的特定值。在这篇文章中,我将介绍如何在C ++中实现这种搜索操作。

地图数组

假设我们有一个地图数组,每个位置上都有一个整数值,表示在这个位置上的障碍物数量。我们的任务是在这个数组中搜索某个特定的值。

我们可以使用一个二维数组来表示这个地图:

const int ROWS = 10;
const int COLS = 10;
int map[ROWS][COLS] = {
    {0, 0, 0, 0, 1, 0, 0, 0, 0, 0},
    {0, 0, 0, 1, 1, 0, 0, 1, 0, 0},
    {0, 0, 1, 1, 1, 0, 0, 0, 0, 0},
    {0, 1, 1, 1, 0, 0, 0, 0, 0, 0},
    {1, 1, 1, 0, 0, 0, 0, 0, 0, 0},
    {0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
    {0, 0, 0, 0, 0, 0, 0, 1, 1, 1},
    {0, 0, 0, 0, 0, 0, 1, 1, 1, 1},
    {0, 0, 0, 0, 0, 0, 1, 1, 1, 1},
    {0, 0, 0, 0, 0, 0, 0, 1, 1, 1}
};

这个地图数组有10行和10列,其中0表示这个位置上没有障碍物,1表示有障碍物。我们的任务是在这个数组中搜索某个特定的值,比如说2。

线性搜索

最简单的搜索方式是线性搜索。我们可以遍历整个数组,对于每个元素,判断它是否等于我们要搜索的值。如果找到了,就返回该元素的位置;如果遍历完整个数组还没有找到,就返回-1。

下面是采用线性搜索实现的查找代码:

#include <iostream>

int linearSearch(int arr[], int size, int value) {
    for (int i = 0; i < size; i++) {
        if (arr[i] == value) {
            return i;
        }
    }
    return -1;
}

int main() {
    const int size = ROWS * COLS;
    int arr[size];

    // 将二维数组转化为一维数组
    for (int i = 0; i < ROWS; i++) {
        for (int j = 0; j < COLS; j++) {
            arr[i * COLS + j] = map[i][j];
        }
    }

    int value = 2;
    int index = linearSearch(arr, size, value);
    if (index != -1) {
        int row = index / COLS;
        int col = index % COLS;
        std::cout << "找到了,位置是(" << row << ", " << col << ")" << std::endl;
    } else {
        std::cout << "没找到" << std::endl;
    }
    return 0;
}
二分搜索

二分搜索(也叫折半搜索)是一种更加高效的搜索方式。它要求搜索的数据必须有序。每次查找都可以将搜索范围缩小一半,因此速度非常快。但是,二分搜索只能用于有序数据。

下面是采用二分搜索实现的查找代码:

#include <iostream>

int binarySearch(int arr[], int size, int value) {
    int left = 0;
    int right = size - 1;

    while (left <= right) {
        int mid = (left + right) / 2;
        if (arr[mid] == value) {
            return mid;
        } else if (arr[mid] < value) {
            left = mid + 1;
        } else {
            right = mid - 1;
        }
    }

    return -1;
}

int main() {
    const int size = ROWS * COLS;
    int arr[size];

    // 将二维数组转化为一维数组,并排序
    for (int i = 0; i < ROWS; i++) {
        for (int j = 0; j < COLS; j++) {
            arr[i * COLS + j] = map[i][j];
        }
    }
    std::sort(arr, arr + size);

    int value = 2;
    int index = binarySearch(arr, size, value);
    if (index != -1) {
        // 根据一维数组的下标计算出二维数组的下标
        int row = index / COLS;
        int col = index % COLS;
        std::cout << "找到了,位置是(" << row << ", " << col << ")" << std::endl;
    } else {
        std::cout << "没找到" << std::endl;
    }
    return 0;
}
总结

以上就是在C ++中按地图中的值搜索的两种常见方法,即线性搜索和二分搜索。这两种方法都可以实现对二维数组的搜索,具有各自的优缺点。相比之下,二分搜索更加高效,但要求搜索的数据必须有序。而线性搜索则比较适用于数据量较小的情况。