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编程语言中,二维数组可以被用来模拟简单的Map数据结构。Map是一种键值对的集合,其中每个键(Key)都是唯一的,并且与一个值(Value)相关联。尽管Java提供了内置的Map接口(如HashMap、TreeMap等),但有时...
这篇课堂笔记主要涵盖了三个核心的计算机科学概念:二分查找、二维数组以及数组的复制。这些知识点在编程学习,特别是数据结构与算法的学习中占据着重要地位。 首先,我们来详细探讨二分查找。二分查找,也被称为...
但由于二维数组的特殊性,线性查找更为常见,尤其是在数组无序或者不满足特定排序条件时。 线性查找(Linear Search)是最基础的查找方法,它遍历数组的每一个元素,直到找到目标值或者遍历完整个数组。对于二维...
《基于二维数组和十字链表的Apriori算法》 Apriori算法是关联规则挖掘中的基础方法,由Agrawal于1993年提出。它的主要目标是从大量事务数据库中找出频繁项集,这些频繁项集反映了不同项之间的频繁共现关系,从而...
此外,二维数组还可以用于实现各种算法,比如矩阵运算(加法、减法、乘法)和线性代数中的特征值计算等。在GE PC中,这些操作可能需要借助特定的数学库,如numpy或scipy。 总结起来,"ge.rar_ge pc 数组_二维数组的...
2. **遍历二维数组**:遍历二维数组通常需要用到两个嵌套的foreach循环,外层循环遍历每一行,内层循环遍历每行的元素。 ```php foreach ($students as $student) { foreach ($student as $key => $value) { echo...
二维数组的操作包括遍历、查找、修改元素、矩阵运算等。在遍历二维数组时,通常使用两重循环,外层循环控制行,内层循环控制列。例如,打印所有元素: ```java for(int i = 0; i ; i++) { for(int j = 0; j ; j++)...
在这个例子中,我们首先创建了一个3行2列的二维数组,然后用线性递增值填充它,并打印出来。`matrix[i][j]`的语法使得访问元素如同操作传统的二维数组一样直观。 `std::vector`还支持动态调整大小,这意味着你可以...
2. **算法实现**:许多基础算法,如查找、排序,都可以用一维数组实现,如线性搜索和冒泡排序。 3. **矩阵表示**:在处理二维问题时,可以将矩阵看作是一维数组,通过行优先或列优先的方式存储。 在提供的文件列表...
【实验四 一维与二维数组实验】 在C语言中,数组是一种非常基础且重要的数据结构,用于存储同类型的数据集合。本实验主要关注一维数组的使用,包括定义、初始化、元素访问、操作以及算法实现。通过这次实验,学生将...
总结来说,这两种方法都是解决在特定排序的二维数组中查找整数问题的有效策略。方法二的效率更高,因为它利用了有序性质进行二分查找,减少了平均查找次数。在实际应用中,我们应该优先考虑时间复杂度更低的方法,以...
通常,这样的函数会接受一个含有NaN值的二维数组作为输入,并返回一个经过插值处理的新的二维数组。函数可能采用了以下步骤: 1. **检测NaN值**:使用`isnan()`函数检查数组中的每个元素是否为NaN。如果元素是NaN,...
二维数组重复项 * @param array $array 二维数组 * @return array 去重后的二维数组 */function removeDuplicateIn2DArray($array){ // 创建一个空数组用于存储去重后的结果 $result = array(); // 遍历原数组 ...
本教程聚焦于C语言中的数组,特别是针对初学者的一系列入门实例,包括一维数组和二维数组的应用。 一、一维数组 一维数组可以看作是线性的数据集合,类似于数学中的数列。在C语言中,声明一维数组的基本语法是: `...
4. **搜索算法**:掌握在二维数组中查找特定元素的算法,如线性搜索、二分查找(如果数组有序)以及深度优先搜索(DFS)和广度优先搜索(BFS)。 5. **动态规划**:很多二维数组问题可以通过动态规划来解决,比如...
而对于无序的二维数组,线性查找可能是唯一的选择。同时,如果需要频繁查找操作,预处理数据,如构建索引,也能显著提升性能。 总的来说,了解和掌握不同查找算法对于PHP开发者来说至关重要,这不仅可以帮助优化...
一维数组可以看作是一条线性的序列,每个元素都有一个唯一的索引,通过索引我们可以快速访问或修改这些数据。以下是对这个主题的详细阐述: 一、一维数组的概念 一维数组是最基本的数组形式,它由相同类型的元素...
你可以创建一维或二维数组来存储和处理数据。例如,一维数组常用来存储线性数据,如一系列数字或字符串;而二维数组则可以模拟表格或矩阵,适用于游戏、数据分析等多种场景。理解数组的声明、初始化、访问和修改元素...
- 查找与排序:快速查找和排序算法如线性查找、二分查找、冒泡排序、插入排序、选择排序等都涉及一维数组。 3. **压缩包中的文件名解析**: - 文件名如 "1095E—2.txt" 可能表示这是问题1095E的一个变种或者第二...
总的来说,Python实现二维有序数组查找的关键在于理解二维数组的特性,并利用这些特性设计出高效的查找算法。通过上述的“边界移动”策略,我们可以快速定位目标值,从而提高程序的运行效率。这个方法不仅适用于...