解决问题:二维数组中的查找:
方案一: 顺序搜索法。其时间复杂度为O(M*N);M/N分别为数组的行和列,比较低效。代码实现也比较简单,这里不做多的介绍。
方案二: 二维法。这是我自己给它取的一个名字,主要是充分利用二维数组的逻辑内存存储方式。利用二维空间来解决,也称“ 去行去列查找法”,同样自创(可以吐槽,呵呵。。)。
具体条件方法如下:
假设该数组中的数据每行从左到右,每列从上到下,都是递增排列。
首先选取数组右上角的数字,
(1)如果该数字等于要查找的数字,则返回,查找成功;
(2)如果该数字小于查找的数字,去掉该行;
(3)如果该数字大于查找的数字,去掉该列;
二维数组是一个比较常用的数据结构,主要由于其顺序存储,其下标引用的查找和访问的随机性优点尤其突出,使其在O(1)时间内就可以访问我们想要的位置数据。
例如我们想要看第10个的数据内容,那么直接取a[9]就可以了,十分方便。但是它也有缺点,那就是插入和删除时效率较低,正因为其连续存储的数据结构,所以在每次插入和删除后都需要移动大量的数据。所以导致其效率比较低下。
下面主要来讨论一下在二维数组中查找一个数据的方法。方案一: 顺序搜索法。其时间复杂度为O(M*N);M/N分别为数组的行和列,比较低效。代码实现也比较简单,这里不做多的介绍。
方案二: 二维法。这是我自己给它取的一个名字,主要是充分利用二维数组的逻辑内存存储方式。利用二维空间来解决,也称“ 去行去列查找法”,同样自创(可以吐槽,呵呵。。)。
具体条件方法如下:
假设该数组中的数据每行从左到右,每列从上到下,都是递增排列。
首先选取数组右上角的数字,
(1)如果该数字等于要查找的数字,则返回,查找成功;
(2)如果该数字小于查找的数字,去掉该行;
(3)如果该数字大于查找的数字,去掉该列;
循环执行(2)(3),直至查找结束;
我觉得画图更直观,如下图所示:
具体实现代码如下:
#include <iostream>
using namespace std;
int array[4][4]={{1,2,4,6},
{2,3,5,7},
{5,8,10,15},
{7,9,12,23}};
int find_value(int (*arr)[4],int rows,int columns,int findvalue)
{
int row=0;
int column=columns-1;
int count=0;
if(NULL==arr || rows<=0 ||columns<=0)
return -1;
if(NULL!=arr && rows>0 && columns>0)
{
while(row<rows && column>=0)
{
count++;
if(arr[row][column]==findvalue)
//条件也可以变为:if(arr[row*columns+column]==findvalue)
{//查找成功;
cout<<"比较次数:"<<count<<endl;
return findvalue;
}
else if(arr[row][column]>findvalue)
{
column--;
}
else
{
row++;
}
}
}
cout<<"比较次数:"<<endl;
return 0; //查找失败!
}
int main()
{
int result=find_value(array,4,4,8);
if(-1==result)
cout<<"数据有误!"<<endl;
else if(0==result)
cout<<"查找失败,没有该数据!"<<endl;
else
cout<<"查找成功:"<<result<<endl;
system("pause");
return 0;
}
运行结果:
从运行结果和图可以看出,查找的次数也为5,。如果按方案一则需要查询10次,效率提高了一倍。如果数据量大,则效果更明显。