1. 程式人生 > >楊氏矩陣的查找問題

楊氏矩陣的查找問題

思路 turn urn 這樣的 意思 線性 個數 時間復雜度 進行

2018-03-17 14:58:38

問題描述:已知一個2維矩陣,其中的元素每一行從左至右依次增加,每一列從上到下依次增加。即對於矩陣Table有Table[i][j] ≤Table[i][j + 1], Table[i][j] ≤ Table[i + 1][j],我們也稱這樣的矩陣為楊氏矩陣。給出判定某個數是否存在該矩陣中的高效算法。

技術分享圖片

問題求解:這個題目個人感覺非常有意思,第一眼看過去會有一種二分查找的二維推廣的感覺,似乎可以用二分查找的方法來解決。這裏不妨假設矩陣的規模為n * n。

如果采用每行的二分查找算法的話,那麽算法的時間復雜度無疑是O(nlogn),還是比較大的。那如何采用一種方法更有效的利用好這裏的已排序的信息呢?

事實上,可以采用Step-wise進行線性搜索,也就是使用步進的方式進行查找,最終可以在O(n)的時間復雜度內完成查找。

思路理解起來也並不困難,就是從矩陣的右上角開始查找,不妨設其為m,如果待查找的值x小於m,則刪去一列,如果待查找的值x大於m,則刪去一行。

如下圖顯示了查找13的軌跡。首先與右上角15比較,13<15,所以去掉最右1列,然後與11比較,這是13>11,去掉最上面1行…以此類推,最後找到13。算法復雜度O(n),最壞情況需要2n步,即從右上角開始查找,而要查找的目標值在左下角的時候。

技術分享圖片

    boolean stepwise(int[][] m, int target) {
        int row = m.length;
        int col = m[0].length;
        int x = 0;
        int y = col - 1;
        while (x < row && y >= 0) {
            if (target > m[x][y])
                x++;
            else if (target < m[x][y])
                y--;
            else return true;
        }
        return false;
    }

楊氏矩陣的查找問題