《算法导论》 6.3 Young氏矩阵

一个m x n的Young氏矩阵(Young tableau)是一个m x n的矩阵,其中每一行的数据都从左到右排序,每一列的数据都从上到下排序。Young氏矩阵中可能会有一些∞数据项,表示不存在的元素。所以,Young氏矩阵可以用来存放r≦mn个有限的数。
    

 

#include<iostream>
#include<limits>
#include<vector>
using namespace std;

//数据交换函数。
void Swap(int &a,int &b)
{
 int c = b;
 b = a;
 a = c;
}
/*

将A[i][j]的键值更新为key,即Young氏矩阵性质保持操作。过程为:将A[m][n]与其上方及左方的元素进行查询,,找到最小值,进行数据交换操作。继续对最小值的下标进行保持Young氏矩阵性质的操作。

*/
void Young_decrease_key(vector< vector<int> > &A,const int i,const int j,const int key)
{
 int maxi = i,maxj = j;
 if((j>0)&&(A[i][j]<A[i][j-1]))
 {
  maxi = i;
  maxj = j-1;
 }
 if((i>0)&&(A[maxi][maxj]<A[i-1][j]))
 {
  maxi = i-1;
  maxj = j;
 }
 if((i != maxi)||(j != maxj))
 {
  Swap(A[i][j],A[maxi][maxj]);
  Young_decrease_key(A,maxi,maxj,key);
 }
}

 

/*

对Young矩阵进行增加键值操作。在该函数中没有增加检测函数是否己满的过程。可检测A[m][n]是否小于最大值,如果是小于的,则己满。

插入过程为:选将A[m][n]更新为key值,然后调用Yount_min_hepify函数进行堆性质保持操作。

*/

void Young_insert(vector< vector<int> > &A,const int key)
{
 vector< vector<int> >::size_type m = A.size()-1;
 vector<int>::size_type n = A[0].size()-1;
 A[m][n] = key;
 Young_decrease_key(A,m,n,key);
}

 

/*

保持Young氏矩阵性质的操作。:然后将原最小值位置,与其右边与下边进行比较,找到最小值,与其进行数据交换。直到不需进行交换为止。

*/
void Young_min_heapify(vector< vector<int> > &A,const int i,const int j)
{
 int m = A.size()-1;
 int n = A[0].size()-1;
 int mini = i;
 int minj = j;
 if((i<m)&&(A[i][j]>A[i+1][j]))
 {
  mini = i+1;
  minj = j;
 }
 if((j<n)&&(A[mini][minj])>A[i][j+1])
 {
  mini = i;
  minj = j+1;
 }

 if((i != mini)||(j != minj))
 {
  Swap(A[i][j],A[mini][minj]);
  Young_min_heapify(A,mini,minj);
 }
}

 

/*

删除并返回最小值,过程为将其进行了同仁赋值最大值操作。

进行保持Young氏矩阵性质的操作。

*/


int Young_extract_min(vector< vector<int> > &A)
{
 int m = A.size()-1;
 int n = A[0].size()-1;
 int min = A[0][0];
 A[0][0] = INT_MAX;
 Young_min_heapify(A,0,0);
 return min;
}

//查找操作。但本查找只能在矩阵是满的情况下查找。时间紧,,就简化了一下。。呵呵。。

 

void Young_search(vector< vector<int> > &A,const int i,const int j,const int m,const int n,const int key)
{
 if((i>m)||(j>n))
 {
  cout<<"Can't find";
  return ;
 }
 if(A[i][n] == key)
 {
  cout<<"找到了,在矩阵的"<<i<<"行"<<n<<"列"<<endl;
  return ;
 }
 if(A[i][n]<=key)
  Young_search(A,i+1,j,m,n,key);
 else
  Young_search(A,i,j,m,n-1,key);
}
void main()
{
 int B[4][4]={INT_MAX};
 int m =4,n = 4;
 vector< vector<int> > A;
 for(int i = 0;i<m;i++)
 {
  vector<int> C;
  for(int j = 0;j<n;j++)
  {
   C.push_back(INT_MAX);
  }
  A.push_back(C);
 }

 Young_insert(A,9);
 Young_insert(A,16);
 Young_insert(A,3);
 Young_insert(A,2);
 Young_insert(A,4);
 Young_insert(A,8);
 Young_insert(A,5);
 Young_insert(A,14);
 Young_insert(A,12);
 Young_insert(A,11);
 Young_insert(A,10);
 Young_insert(A,20);
 Young_insert(A,7);
 Young_insert(A,15);
 Young_insert(A,14);
 Young_insert(A,18);

 Young_extract_min(A);
 for(int i = 0;i<m;i++)
 {
  for(int j = 0;j<n;j++)
  {
   if(A[i][j] == INT_MAX)
    break;
   cout<<A[i][j]<<"  ";
  }
  cout<<endl;
 }
 
 Young_search(A,0,0,3,3,16);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值