杨氏矩阵查找
2013-06-14 13:00
399 查看
一、问题描述
给定一个二维数组,如果这个二维数组满足下面两个条件则称为杨氏矩阵。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
相关文章推荐
- 杨氏矩阵查找的Java实现
- 第二十三、四章:杨氏矩阵查找,倒排索引关键词Hash不重复编码实践
- 杨氏矩阵中查找一个数-时间复杂度小于O(N)
- 杨氏矩阵查找,倒排索引关键词Hash编
- 第二十三章:杨氏矩阵查找、排序、添加、删除
- 杨氏矩阵 中查找一个数字是否存在,时间复杂度小于O(N)
- 杨氏矩阵查找元素位置Java实现
- leetcode74---杨氏矩阵查找SearchIn2DMatrix
- 编程艺术第二十三~四章&十一续:杨氏矩阵查找,倒排索引关键词Hash编码
- 堆排序(JAVA)实现和杨氏矩阵查找
- 【C语言】在杨氏矩阵中查找一个数
- 编程艺术第二十三~四章&十一续:杨氏矩阵查找,倒排索引关键词Hash编码
- 杨氏矩阵查找实现
- 程序员编程艺术第二十三~四章:杨氏矩阵查找,倒排索引关键词Hash编码
- 【C语言】【面试题】【笔试题】二维数组中的查找,杨氏矩阵
- 【每日一题-12】平衡二叉树/镜像与杨氏矩阵查找
- 编程艺术第二十三~四章&十一续:杨氏矩阵查找,倒排索引关键词Hash编码
- [转]杨氏矩阵查找
- 杨氏矩阵查找,倒排索引关键词Hash编码
- 杨氏矩阵查找