演算法學習 楊氏矩陣

2021-06-07 13:35:10 字數 1418 閱讀 1584

楊氏矩陣中,每行元素是遞增的,每列元素也是遞增的。

思想:從矩陣的右上角(或者左下角)開始查詢num,如果a[i][j]num,則比較a[i-1][j]與num之間的關係。當a[i][j]等於num,或者i、j至少有乙個超出矩陣範圍,則結束查詢。

查詢流程圖如下所示:

演算法複雜度:o(n+m)

思想:類似於堆排序。a[0][0]必然是楊氏矩陣中最小的那個數,取出這個數,並用a[n-1][m-1]這個數替換。此時該矩陣已不滿足楊氏矩陣條件,需要對其進行調整。調整方法

a[i][j]與a[i][j+1]進行比較,得出a[i][j]與a[i][j+1]大小關係,如果a[i][j]a[i][j+1]&&a[i][j]>a[i+1][j]時,調整完畢。

偽**:

young-extract-min(a)

min←a[1,1]

a[1,1]←a[m,n]

young-min-heapify(a, 1, 1)

return min

young-min-heapify(a, i, j)

if ja[i,j+1]

then (min_i, min_j) = (i, j+1)

else (min_i, min_j) = (i, j)

if ia[i+1,j]

then (min_i, min_j) = (i+1, j)

if min_i≠i or min_j≠j

then exchange a[i,j]↔a[min_i,min_j]

young-min-heapify(a,min_i,min_j

#includeusing namespace std;

#define n 4

#define m 4

int findnum(int a[m],int num);

void young_extract_min(int a[m]);

void young_min_heapy(int a[m],int row,int col);

int main()

,,,};

int ret,num;

cin>>num;

ret=findnum(a,num);

if(ret==-1)

cout<=0&&i=0&&j=0;i--)

for(int j=m-1;j>=0;j--)

if(min_ia[row+1][col])

if(min_i!=row || min_j!=col)

}

參考:

楊氏矩陣演算法

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

楊氏矩陣學習筆記

參考資料 ioi2019中國國家候選隊 集 袁方舟 楊氏矩陣在資訊學競賽中的應用 標準楊表大概就是行單調增,列單調增並且行數單調不增,列數單調不增的乙個矩陣 半標準楊表大概就是行或列有乙個單調不降 插入x 以行為例 從第一行開始 每次在當前行行找第乙個最小的比x大的數 找不到就插到行末並退出 否則替...

c語言楊氏矩陣演算法

楊氏矩陣 有乙個二維陣列.陣列的每行從左到右是遞增的,每列從上到下是遞增的.在這樣的陣列中查詢乙個數字是否存在。時間複雜度小於o n 陣列 1 2 3 2 3 4 3 4 5 1 3 4 2 4 5 4 5 6 1 2 3 4 5 6 7 8 9 define crt secure no warni...