楊氏矩陣查詢

2021-06-29 06:13:38 字數 1176 閱讀 6464

在乙個m 行n 列二維陣列中,每一行都按照從左到右遞增的順序排序,每一列都按照從

上到下遞增的順序排序。請完成乙個函式,輸入這樣的乙個二維陣列和乙個整數,判斷陣列

中是否含有該整數。

【方案一】

《二分查詢》

對於楊氏矩陣,由於每行每列均是有序的,則可以於矩陣採用二分查詢。具體方法是:

對於當前子矩陣a[i][j]~a[s][t],中間元素為a[(i+s)/2][(j+t)/2],如果a[(i+s)/2][(j+t)/2]==x,則找出該元素;如果a[(i+s)/2][(j+t)/2] > x,則在子矩陣a[i][j]~a[(i+s)/2][(j+t)/2]中查詢;如果a[(i+s)/2][(j+t)/2] < x,則在三個子矩陣:a[i][(j+t)/2]~ a[(i+s)/2][t],a[(i+s)/2][(j+t)/2]~ a[s][t]和a[(i+s)/2][j]~ a[s][ (j+t)/2]中查詢。該演算法的遞迴式為f(mn)=3f(mn/4)+o(1),根據主定理知,時間複雜度為:o((mn)^(log4(3)))。

【方案二】

《類堆查詢法》

楊氏矩陣具有明顯的堆特徵:從矩陣的右上角出發(從左下角出發思路類似),對於元素a[i][j],如果a[i][j]==x,則找到元素x,直接返回;如果a[i][j] > x,則向下移動,即繼續比較a[i+1][j]與x;如果a[i][j]

#include

using

namespace

std;

const

int m=4,n=4;

bool youngsearch(int young[n],int m,int n,int x)else

if(young[i][j]//young[i][j]在右上角,要增大,必須下移

}else

}return

false;

}int main(),,,};

if(youngsearch(young,m,n,8))

結果是:存在

還有注意一點,對於二維陣列作形參的問題,最好把形參寫成int data[n]的形式,盡量不要用int **data,後者的輸入操作很麻煩。以前有一篇博文介紹後者:

其實楊氏矩陣還有很多操作,可參考:

未看)

未看)

楊氏矩陣查詢

題目為 在乙個二維陣列中,每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成乙個函式,輸入這樣的乙個二維陣列和乙個整數,判斷陣列中是否含有該整數。例如下面的二維陣列就是每行 每列都遞增排序,如果在這個陣列中查詢數字6,則返回true 如果查詢數字10,由於陣列不含有該數字...

楊氏矩陣查詢

方案一 時間複雜度o m n 原理 從右上角開始 左下角相同 如果arr i j t,就向左查詢,如果arr i j 2013.7.23 0423 function 楊氏矩陣查詢 在乙個二維陣列中,每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成乙個函式,輸入這樣的乙個...

楊氏矩陣查詢

題目描述 楊氏矩陣,即在乙個二維陣列中,每一行都按照從左到右嚴格遞增的順序排序,每一列都按照從上到下嚴格遞增的順序排序。請完成乙個函式,輸入這樣的乙個 n n的二維陣列和 m個整數,判斷陣列中是否含有上述 m個整數。你能解決這個問題嗎?輸入格式 可能有多個測試輸入,第一行給出總共的測試輸入的個數。對...