`
hao3100590
  • 浏览: 128670 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

线性查找二维数组

阅读更多

1.算法描述

有序(行有序,列有序,且每行从左至右递增,列从上至下递增)二维数组查找,要求复杂度O(n)

 

2.使用到的相关知识:

结构体定义和使用,二维数组传递(http://blog.csdn.net/yzhhmhm/article/details/2045816

 

3.使用数组名传递

这个的不便之处很明显,一旦确定就是不能设置列值

//使用数组名实现(不便之处很明显:列值确定了,不能灵活)
loc* findValue(int a[][5], int row, int value){
	int col = sizeof(a)/sizeof(int)*row;
	cout<<"size:"<<col<<endl;
	//先按列比较(第0列),找到所在的行
	int currRow = 0;
	for(int i=0; i<row; i++){
		if(a[i][0] > value){
			if(i != 0) currRow = i - 1;
			break;
		}
	}

	int index = search(a[currRow], 5, value);
	//利用结构体指针
	loc *l;
	l->row = currRow;
	l->col = index;
	return l;
}

 

4.使用指针数组传递

//使用指针数组实现
loc findValue(int* a[], int row, int col, int value){
	//先按列比较(第0列),找到所在的行
	int currRow = 0;
	for(int i=0; i<row; i++){
		if(a[i][0] > value){
			if(i != 0) currRow = i - 1;
			break;
		}
	}

	int index = search(a[currRow], col, value);
	loc l;
	l.row = currRow;
	//在给定的行中搜索
	l.col = index;
	return l;
}

 

5.所有代码

/**
	*有序(行有序,列有序,且每行从左至右递增,列从上至下递增)二维数组查找
	*要求复杂度O(n)
	*/
#include <iostream>
using namespace std;
struct loc{
 int row;
 int col;
};

//如果找到放回下标,否则-1
int search(int *a, int length, int value){
	int i=0,j=length-1;
	while(i<=j){
		int center = (i+j)/2;
		if(a[center]<value) i=center+1;
		else if(a[center]>value) j=center-1;
		else return center;
	}
	return -1;
}


//使用数组名实现(不便之处很明显:列值确定了,不能灵活)
loc* findValue(int a[][5], int row, int value){
	int col = sizeof(a)/sizeof(int)*row;
	cout<<"size:"<<col<<endl;
	//先按列比较(第0列),找到所在的行
	int currRow = 0;
	for(int i=0; i<row; i++){
		if(a[i][0] > value){
			if(i != 0) currRow = i - 1;
			break;
		}
	}

	int index = search(a[currRow], 5, value);
	//利用结构体指针
	loc *l;
	l->row = currRow;
	l->col = index;
	return l;
}


//使用指针数组实现
loc findValue(int* a[], int row, int col, int value){
	//先按列比较(第0列),找到所在的行
	int currRow = 0;
	for(int i=0; i<row; i++){
		if(a[i][0] > value){
			if(i != 0) currRow = i - 1;
			break;
		}
	}

	int index = search(a[currRow], col, value);
	loc l;
	l.row = currRow;
	//在给定的行中搜索
	l.col = index;
	return l;
}

int main(){
	int a[5][5],k=0;
	for(int i=0; i<5;i++){
		for(int j=0; j<5; j++){
			a[i][j] = k++;
		}
	}
	
	int value;
	cout<<"输入要查找的值:";
	cin>>value;
	//---------1---------
	loc* ll = findValue(a, 5,value);
	if(ll->col != -1){
		cout<<"位置在:("<<ll->row<<","<<ll->col<<")"<<endl;
	}else{
		cout<<"没有找到!"<<endl;
	}
	
	//---------2---------
	//使用指针数组,必须先将二维数组转换为下面的形式
	int *p[] = {*a, *(a+1),*(a+2),*(a+3),*(a+4)};
	loc l = findValue(p, 5,5,value);
	if(l.col != -1){
		cout<<"位置在:("<<l.row<<","<<l.col<<")"<<endl;
	}else{
		cout<<"没有找到!"<<endl;
	}
	return 0;
}
 
分享到:
评论

相关推荐

    第一个数组内有学号、姓名、第二个数组有《高等数学》、《线性代数》、《Java程序设计》、《大学英语》、每个人的总成绩和平均成

    某班级有10名学生,声明两个二维数组,第一个数组内有学号、姓名、第二个数组有《高等数学》、《线性代数》、《Java程序设计》、《大学英语》、每个人的总成绩和平均成绩。 编写程序,完成下列任务:①计算每个人的...

    数据排序的几种方法(c语言实现)

    数据排序的几种方法(c语言实现),自己写的,很实用

    谭浩强C语言程序设计,C++程序设计,严蔚敏数据结构,高一凡数据结构算法分析与实现.rar

    7.2.2 二维数组元素的引用 86 7.2.3 二维数组的初始化 87 7.2.4 二维数组程序举例 89 7.3 字符数组 89 7.3.1 字符数组的定义 89 7.3.2 字符数组的初始化 89 7.3.3 字符数组的引用 90 7.3.4 字符串和字符串结束标志 ...

    谭浩强C语言程序设计,C++程序设计,严蔚敏数据结构,高一凡数据结构算法分析与实现.rar )

    7.2.2 二维数组元素的引用 86 7.2.3 二维数组的初始化 87 7.2.4 二维数组程序举例 89 7.3 字符数组 89 7.3.1 字符数组的定义 89 7.3.2 字符数组的初始化 89 7.3.3 字符数组的引用 90 7.3.4 字符串和字符串结束标志 ...

    leetcode2sumc-C-Cpp-Programs:c基本程序

    leetcode 2 和 c C++ 程序和 DSA 不 程序 解决方案 语 1 你好,世界 C++ 2 线性搜索 C++ 3 二分查找 C++ 4 最大最小 ...二维数组 不 程序 解决方案 语 1 二维数组 C++ 2 WavePrint_2D C++ 3 C++ 4 C+

    tictactoeleetcode-JavaPlayground:Java注解、线程使用、设计模式、算法训练等

    二维数组 新年混乱 DNA补体 嗡嗡声 笔记本电池寿命 字符串字谜 二维数组 袜子商人 排序和 LeetCode Java 问题 两和 Java高级 注释 线程用法 流和可选 可选基础知识 平面图 并行流 流收集 流映射减少 流对象 删除重复...

    leetcode跳跃-DataStructureAndAlgorithm:数据结构理论知识&LeetCode

    tips:用一个二维数组表示两个字符串对应的子串的公共子串的长度的查找表table 边界条件 二维数组的行和列分别比输入的两个字符串长度各增加1,用于处理空串,即table左上角肯定为0,表示输入为空字符串的时候的公共...

    计算机二级公共基础知识

    例如,在一维数组[21,46,24,99,57,77,86]中,查找数据元素99,首先从第1个元素21开始进行比较,比较结果与要查找的数据不相等,接着与第2个元素46进行比较,以此类推,当进行到与第4个元素比较时,它们相等,...

    Connector-Game:CS61BL 项目 1

    相比之下,对于有序数组或二维数组,所有连接器都被初始化,但不一定按顺序进行,因为播放器/计算机不一定按照数组排列连接器对象的顺序播放。 因此,Board.java 需要额外的时间来查找应修改数组中的哪个单元格。 ...

    javascript入门笔记

    特点:将 a 和 b 先转换为二进制,按位操作,对应位置上的两个数字,相同时,该位整体结果为0,不同时,该位的整体结果为 1 使用场合:快速交换两个数字 5 ^ 3 101 011 ========== 110 结果为 6 练习: ...

    高校数据结构期末考题库

    4、二维数组是其数组元素为线性表的线性表。( ) 5、每种数据结构都应具备三种基本运算:插入、删除和搜索。( ) 6、数据结构概念包括数据之间的逻辑结构,数据在计算机中的存储方式和数据的运算三个 方面。( ) 7、...

    2003年-数据结构.docx

    (×) 二维数组是其数据元素为线性表的线性表。( ) 一个栈的输入序列是12345,则输出序列43512是可能的。(×) 单项选择题 数据结构从逻辑上可以分成 线性和非线性 两种结构。 哈希(Hash)法查找的基本思想是...

    数据结构各章习题及答案

    2、对于一个二维数组A[m][n],若按行序为主序存储,则任一元素A[i][j]相对于A[0][0]的地址为(A+(i*m+j)*每个元素所占字节数)。 1、假定在一棵二叉树中,度为2的分支结点个数为15,度为1的分支结点个数为30个,则...

    青少年儿C++编程PPT课件教程中小学生培训机构班教学60节课程体系

    循环嵌套第10讲 一维数组第11讲 字符串第12讲 二维数组第13讲 函数第14讲 链表第15讲 数据结构与算法第1讲 指针第2讲 栈第3讲 队列第4讲 高精度数第5讲 排序1第6讲 排序2第7讲 递推第8讲 递归第9讲 文件操作第10讲 ...

    天津大学《计算机软件技术基础(2)》在线作业二.docx

    A:二维数组和三维数组 B:三元组和散列 C:三元组和十字链表 D:散列和十字链表 参考选项:C 天津大学《计算机软件技术基础(2)》在线作业二全文共7页,当前为第1页。 天津大学《计算机软件技术基础(2)》在线作业二全文...

    精通matlab综合辅导与指南例程

    18.8 三维数据的二维图 18.9 其它函数 18.10 动画 18.11 小结 第19章 颜色 19.1 颜色映象理解 19.2 颜色映象使用 19.3 颜色映象显示 19.4 颜色映象的建立和修改 19.5 图形中使用一个以上的颜色映象 19.6 ...

    精通matlab-综合辅导与指南(附例程)

    18.8 三维数据的二维图 18.9 其它函数 18.10 动画 18.11 小结 第19章 颜色 19.1 颜色映象理解 19.2 颜色映象使用 19.3 颜色映象显示 19.4 颜色映象的建立和修改 19.5 图形中使用一个以上的颜色映象 19.6 ...

    精通MATLAB—综合辅导与指南

    18.8 三维数据的二维图 18.9 其它函数 18.10 动画 18.11 小结 第19章 颜色 19.1 颜色映象理解 19.2 颜色映象使用 19.3 颜色映象显示 19.4 颜色映象的建立和修改 19.5 图形中使用一个以上的颜色映象 19.6 ...

Global site tag (gtag.js) - Google Analytics