参考资料:http://blog.csdn.net/sgbfblog/article/details/7745450
题目:
杨氏矩阵----------矩阵每一行元素从左到右依次递增;每一列从上到下依次递增
问题:判断任意一个元素是否在该矩阵中
例如如下的杨氏矩阵:
解法一:
step_wise线性搜索算法----------从右上角开始,每次将待搜索值与右上角元素进行比较,若待搜索元素大于右上角值,则去除一行,否则去除一列。
比如待搜索元素为13,右上角元素为15,那么右上角元素所在列删除(因为,列逐渐递增),同理11小于13因此删除一行…最终查找的路线为下图中红色
路线,最差的情况下,查找从右上角直到左下角对于M*N矩阵,时间复杂度为O(M+N)
/* * */ #include<iostream> using namespace std; bool find(int (*array)[3],int m,int n,int value) { bool findout=false; int row=0; int col=n-1; while(!findout && row <m && col>=0) { if(array[row][col]==value) { findout=true; cout<<"row:"<<row<<",col:"<<col<<endl; } else if(array[row][col]>value) { col--; } else { row++; } } return findout; } int main() { int array[3][3]={ {1,3,8}, {2,4,9}, {3,5,17} }; int m=3; int n=3; int value=12; bool result=find(array,m,n,value); if(result) { cout<<"TURE"<<endl; } else { cout<<"FLASE"<<endl; } }
解法二:
二分算法------从矩阵的中间行或者中间列或者对角线开始查找,找到满足:
ai < s < ai+1 , 其中ai为矩阵中的值。将矩阵分成两个子矩阵,然后继续进行划分
(1)从中间行开始查找
(2)从中间列开始查找
(3)从对角线开始查找