您的位置:首页 > 其它

杨氏矩阵查找

2013-05-04 00:24 295 查看

一、问题描述

给定一个二维数组,如果这个二维数组满足下面两个条件则称为杨氏矩阵。

1. 在这个二维数组的每一行都按照从左到右的顺序递增。

2. 在这个二维数组的每一列都按照从上到下的顺序递增。

现在需要完成以下的一个功能:输入这样的一个二维数组,并且给定一个要查找的数,判断该数是否存在在这个二维数组中。

二、问题分析

这里不讲述遍历这个二维数组来查找该数(时间复杂程度为O(row * column))。既然是在杨氏矩阵中查找一个数find_number,那么就一定要用上杨氏矩阵的性质。假设查找到杨氏矩阵数组numbers的第i行第j列,即numbers[i][j],那么来判断一下find_number是否和numbers[i][j]相等,如果相等就找到了。如果find_number>numbers[i][j],根据杨氏矩阵的性质,它需要往下面走或者往右面走。如果find_number<numbers[i][j],根据杨氏矩阵的性质,它需要往上面走或者往左面走。但是要是这么以来的话,还需要考虑两个方向的移动。那么能不能在查找过程中只朝着某一个方向移动呢?答案是可以的,这就需要选好第一个查找位置,由于想要只能沿着一个方向移动,那么最开始的位置也只能是二维数组的四个角。那么选择哪一个角呢,假设选择numbers[0][0]这个角的话,如果find_number>numbers[i][j]的话,还是有两个方向可以移动(下和右)。选择numbers[row - 1][column - 1]这个角的话(row代表二维数组有多少行, column代表二维数组有多少列)可以做和上面类似的分析。那么,如果我们把初始的查找位置选择成numbers[0][column - 1]时,查找时将只有一个方向可以选择,如果find_number>numbers[i][j],那么查找路径需要向下查找,如果find_number>numbers[i][j],那么查找路径需要向左查找。初始路径选择numbers[row - 1][0]时可以做类似的分析。这么一来,时间复杂程度为O(row + column)。

在下面的程序实现时,只给出了初始位置选择numbers[0][column - 1]的情形。另一种情形读者可以自行完成。

三、程序实现

这里数据的范围可以参照参考资料1,即row和column都是1000以内,find_number的范围小于1000*1000,注意find_number类型的选取。

程序如下:

#include <stdio.h>

#define MAX_BUF 1024

int main(int argc, char *argv[])
{
int row,
column;
long find_number = 0;
int numbers[MAX_BUF][MAX_BUF];
int i,
j;

while(EOF != (scanf("%d %d", &row, &column)))
{
scanf("%ld", &find_number);
for(i = 0; i < row; i++)
for(j = 0; j < column; j++)
scanf("%d", &numbers[i][j]);

int flag = 0;
i = 0;
j = column - 1;

while(row > i && 0 <= j)
{
if(find_number == numbers[i][j])
{
flag = 1;
break;
}
else if(find_number < numbers[i][j])
{
j--;
continue;
}
else
{
i++;
continue;
}
}
flag == 1?
(printf("find %ld,the row index: %d,the column index %d\n", find_number, i + 1, j + 1)):
(printf("not find %ld\n", find_number));
}

return 0;
}


四、测试结果



五、参考资料

1. 三月面试集训第1周回顾 杨氏矩阵查找:

http://hero.pongo.cn/Question/Details?ID=18&ExamID=18

说明:

如有错误还请各位指正,欢迎大家一起讨论给出指导。

上述程序完整代码的下载链接:
https://github.com/zeliliu/BlogPrograms/tree/master/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84%26%E7%AE%97%E6%B3%95/yang%20matrix%20finding

最后更新时间:2013-05-04

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: