杨氏矩阵查找的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<currentcurrent向左边移动,继续查找。

如果target>currentcurrent向下边移动,继续查找。

如果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)));}}

原创粉丝点击