算法导论 6-3 Young tableaus 杨氏矩阵

6-3 Young tableaus 杨氏矩阵
An m*n Young tableau is an m*n matrix such that the entries of each row are
in sorted order from left to right and the entries of each column are in sorted order
from top to bottom. 
Some of the entries of a Young tableau may be Max(Long.Max), which we treat as nonexistent elements. 

Thus, a Young tableau can be used to hold r <= m*n finite numbers.

a. Draw a 4*4 Young tableau containing the elements {9; 16; 3; 2; 4; 8; 5; 14; 12}.

[2,  3,  9,   12]
[4,  8,  14,  max]
[5, 16,  max, max]
[max,max,max, max]
b. Argue(prove) that an m*n Young tableau Y is empty if Y[1,1]= Max. 
Argue that Y is full (contains m*n elements) if Y[m,n]< Max.

public class YoungTableaus {
  public static void main(String[] args) {
    int[][] young = new int[4][4];
    init(young);
    youngExtractMin(young, 4, 4);
    youngInsert(young, 17, 4, 4);
    youngInsert(young, 23, 4, 4);
    youngExtractMin(young, 4, 4);
    youngInsert(young, 19, 4, 4);
    youngInsert(young, 13, 4, 4);
    youngSearch(young, 5, 4, 4);
    youngSearch(young, 9, 4, 4);
    youngSearch(young, 3, 4, 4);
    youngSearch(young, 18, 4, 4);
  }
  /* c. Give an algorithm to implement EXTRACT-MIN on a nonempty m*n Young tableau
   that runs in O(m+n) time.
   */
  public static int youngExtractMin(int[][] young, int m, int n) {
    int min = young[0][0];
    int i=0;
    int j=0;
    young[i][j] = Integer.MAX_VALUE;
    youngAdjust(young, i, j, m, n);
    System.out.println("Extracted min:" + min);
    youngPrint(young, 4);
    return min;
  }
  public static void youngAdjust(int[][] young, int i, int j, int m, int n) {//O(m+n)
    int row =i;
    int col =j;
    int min = young[i][j];
    if(i+1<m && min > young[i+1][j]) {//move down to next row
      row = i +1;
      col = j;
      min = young[i+1][j];
    }
    if(j+1<n && min> young[i][j+1]) {//move right to next column
      row = i;
      col = j +1;
      min = young[i][j+1];
    }
    if(row != i || col != j) {
      int tmp = young[row][col];
      young[row][col]=young[i][j];
      young[i][j] = tmp;
      youngAdjust(young, row, col, m, n);
    }
  }
  /* d. Show how to insert a new element into a non full m*n Young tableau in O(m+n) time.
   insert to Y[m-1][n-1] if table is not full, then adjust to left/up or up/left. */
  public static void youngInsert(int[][] young, int key, int m, int n) {
    if(young[m-1][n-1] < Integer.MAX_VALUE) {
      throw new RuntimeException("Young table is full, can not insert any data!");
    }
    young[m-1][n-1] = key;
    System.out.print("Insert "+key+" at ");
    int i = m-1;
    int j = n-1;
    int row = i;
    int col = j;
    int max = key;
    while(true) {
      if(i > 0 && young[i-1][j] > max) {//check row-1 first, if [i][j-1]=[i-1[j], move up to row-1
        row = i -1;
        col = j;
        max = young[i-1][j];
      }
      if(j > 0 && young[i][j-1] > max) {//check col-1 second, if [i][j-1]=[i-1[j], move up to row-1
        row = i;
        col = j-1;
        max = young[i][j-1];
      }
      if(max != young[i][j]) {
        int temp = young[row][col];
        young[row][col] = young[i][j];
        young[i][j] = temp;
        i = row;
        j = col;
        max = young[i][j];
      }
      else {
        System.out.println("["+i+","+j+"]");
        break;
      }
    }
    youngPrint(young, 4);
  }
/**
f. Give an O(m+n)-time algorithm to determine whether a given number is
stored in a given m*n Young tableau.
From [m-1][0] or [0][n-1] start search, exclude one row/column after comparing
 */
  public static boolean youngSearch(int[][] young, int key, int m, int n) {
    int i = 0;
    int j = n-1; //from Y[0][n-1] start search
    while(i<m && j>=0) {
      if(young[i][j] > key) {
        j--;  // exclude j column since they are bigger
      }
      else if(young[i][j] < key) {
        i++;  // exclude i row since they are smaller 
      }
      else {
        System.out.println(key+" was found at "+i+","+j);
        return true;
      }
    }
    System.out.println(key+" was not found even at "+i+","+j);
    return false;
  }
  static void youngPrint(int[][] young, int m) {
    System.out.println("Young Tableau:");
    for(int i=0; i<m; i++) {
      System.out.println(Arrays.toString(young[i]));
    }
  }
  static void init(int[][] young) {
    for(int i=0; i<4; i++) {
      for(int j=0; j<4; j++) {
        young[i][j] = Integer.MAX_VALUE;
      }
    }
    young[0][0] = 2;
    young[0][1] = 3;
    young[0][2] = 9;
    young[0][3] = 12;
    young[1][0] = 4;
    young[1][1] = 8;
    young[1][2] = 14;
    young[2][0] = 5;
    young[2][1] = 16;
    youngPrint(young, 4);
  }
/**
e. Using no other sorting method as a subroutine, show how to use an n*n Young 
tableau to sort n^2 numbers in O(n^3) time. 
User extractMin to get first with O(n+n), then get n^2 sorted numbers with O(n^3) 
 */
  public static void sortNumbers(int[][] young) {
  }
}

References:

http://blog.csdn.net/mishifangxiangdefeng/article/details/7976452

http://blog.csdn.net/v_JULY_v/article/details/7085669

http://blog.csdn.net/huangxy10/article/details/8017765


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值