一个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);
}