杨氏矩阵查找的Java实现
来源:互联网 发布:mac安装exe软件 编辑:程序博客网 时间:2024/05/01 00:01
杨氏矩阵具有以下性质,对于矩阵中任意一点,坐标(x,y),都有:
matrix[x,y] < matrix[x+1,y]
matrix[x,y] < matrix[x,y+1]
换句话说,就是对于任意一个元素,它右边和下方的元素都比它要大。
或者说,对于矩阵,任意一行,任意一列元素都是严格的增序。
根据这个性质,不难推出:
matrix[x,y-1]<matrix[x,y]<matrix[x+1,y]
也就是说,任意元素,它左边的元素比它小,下边的元素比它要大。
所以,如果要在矩阵中查找某个元素,可以利用这个性质,从矩阵最右上方开始查找。
如果target<current,current向左边移动,继续查找。
如果target>current,current向下边移动,继续查找。
如果target==current,命中查找。
如果数组越界,则非命中查找。
这个算法效率很高,足以胜任长宽(size)上百万的矩阵查找。
import java.util.Arrays;//矩阵接口interface Matrix {public int size();public int get(int x, int y);}//矩阵实现类class ArrayMatrix implements Matrix {private final int size;private final int[][] matrix;public ArrayMatrix(int size, int[][] matrix) {this.size = size;this.matrix = matrix;}//返回矩阵的长宽public int size() {return size;}public int get(int x, int y) {return matrix[x][y];}}public class Morpheus {//查找矩阵中指定的值public int[] find(Matrix matrix, int neo) {//从右上角开始查找int row = 0;int col = matrix.size() - 1;int value = matrix.get(row, col);while(value != neo){if(neo < value){col--;}else if(neo > value){row++;}//越界,非命中查找if(col < 0 || row >= matrix.size()){return null;}value = matrix.get(row, col);}//返回坐标return new int[]{row,col};}public static void main(String[] args) {//杨氏矩阵int[][] values = { { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9}, {10,11,12,13,14,15,16,17,18,19}, {20,21,22,23,24,25,26,27,28,29}, {30,31,32,33,34,35,36,37,38,39}, {40,41,42,43,44,45,46,47,48,49}, {50,51,52,53,54,55,56,57,58,59}, {60,61,62,63,64,65,66,67,68,69}, {70,71,72,73,74,75,76,77,78,79}, {80,81,82,83,84,85,86,87,88,89}, {90,91,92,93,94,95,96,97,98,99} }; Matrix matrix = new ArrayMatrix(10, values); //命中查找 int neo = 98; //[9, 8] System.out.println(Arrays.toString(new Morpheus().find(matrix, neo))); //非命中查找 neo = 101; //null System.out.println(Arrays.toString(new Morpheus().find(matrix, neo)));}}
阅读全文
0 0
- 杨氏矩阵查找的Java实现
- 杨氏矩阵查找元素位置Java实现
- 堆排序(JAVA)实现和杨氏矩阵查找
- 杨氏矩阵的查找
- 杨氏矩阵的查找
- 杨氏矩阵的查找
- 行列递增矩阵的查找(杨氏矩阵查找)
- java杨氏矩阵查找算法
- java杨氏矩阵查找算法
- 杨氏矩阵查找!
- 杨氏矩阵查找
- 杨氏矩阵查找
- 杨氏矩阵查找
- 杨氏矩阵查找
- 杨氏矩阵查找
- 杨氏矩阵查找
- 杨氏矩阵查找
- 杨氏矩阵查找
- [题解]codeforces 438d The Child and Sequence
- Oracle 10g安装教程
- 评教管理系统
- Asp.net创建Datatable并赋值
- opencv 之运动物体检测(二)
- 杨氏矩阵查找的Java实现
- 分布式消息队列RocketMQ源码分析之3 -- Consumer负载均衡机制 -- Rebalance
- dubbo和zookeeper使用
- C++ explicit
- Eclipse for C/C++ 默认设置改动点
- C语言知识点大总结
- PAT 乙级 1017. A除以B (20)
- centos6安装graphite+carbon+stashd+grafana
- Java基础ArrayList、Servlet与Filter