首页 > 其他 > 详细

数组之杨氏矩阵

时间:2014-04-22 12:19:58      阅读:471      评论:0      收藏:0      [点我收藏+]

参考资料:http://blog.csdn.net/sgbfblog/article/details/7745450 

 

题目:

     杨氏矩阵----------矩阵每一行元素从左到右依次递增;每一列从上到下依次递增

     问题:判断任意一个元素是否在该矩阵中

例如如下的杨氏矩阵:

bubuko.com,布布扣

 

解法一:

      step_wise线性搜索算法----------从右上角开始,每次将待搜索值与右上角元素进行比较,若待搜索元素大于右上角值,则去除一行,否则去除一列。

比如待搜索元素为13,右上角元素为15,那么右上角元素所在列删除(因为,列逐渐递增),同理11小于13因此删除一行…最终查找的路线为下图中红色

路线,最差的情况下,查找从右上角直到左下角对于M*N矩阵,时间复杂度为O(M+N)

bubuko.com,布布扣

bubuko.com,布布扣
/*
 *
 */

#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;
    }
}
bubuko.com,布布扣

 

解法二:

   二分算法------从矩阵的中间行或者中间列或者对角线开始查找,找到满足:

 ai < s < ai+1 ,  其中ai为矩阵中的值。将矩阵分成两个子矩阵,然后继续进行划分
 
   (1)从中间行开始查找
    bubuko.com,布布扣
 
 
    (2)从中间列开始查找
    bubuko.com,布布扣
 
 
    (3)从对角线开始查找
    bubuko.com,布布扣

数组之杨氏矩阵,布布扣,bubuko.com

数组之杨氏矩阵

原文:http://www.cnblogs.com/luosongchao/p/3679456.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!