《剑指offer》:[8]二维数组中的查找

解决问题:二维数组中的查找:

     二维数组是一个比较常用的数据结构,主要由于其顺序存储,其下标引用的查找和访问的随机性优点尤其突出,使其在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次,效率提高了一倍。如果数据量大,则效果更明显。






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值