📅  最后修改于: 2023-12-03 15:37:34.427000             🧑  作者: Mango
在编程中,常常需要在数据集合中进行搜索操作。一个常见的情况是搜索一个二维数组中的特定值。在这篇文章中,我将介绍如何在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 ++中按地图中的值搜索的两种常见方法,即线性搜索和二分搜索。这两种方法都可以实现对二维数组的搜索,具有各自的优缺点。相比之下,二分搜索更加高效,但要求搜索的数据必须有序。而线性搜索则比较适用于数据量较小的情况。