Ահա Յունգի աղյուսակի մի նմուշ, որը պարունակում է \(0\), \(1\), \(2\), \(3\), \(5\), \(7\), \(9\) թվերը։
| 0 | 0 | 2 | 9 |
| 3 | 5 | 7 | ∞ |
| ∞ | ∞ | ∞ | ∞ |
Իրական թվերի համար նախատեսված Յունգի աղյուսակը կարելի է սահմանել C++ լեզվի հետևյալ դասով․
class Tabelau {
private:
int rows; // տողերի քանակը
int columns; // սյուների քանակը
double** data; // տվյալների աղյուսակ
public:
Tabelau( int, int );
~Tabelau();
bool is_empty() const; // աղյուսակը դատարկ է
bool is_full() const; // աղյուսակը լցված է
double minimum() const; // փոքրագույն տարրը
void add( double ); // ավելացնել նոր տարր
void remove(); // հեռացնել փոքրագույն տարրը
private:
// աղյուսակի կարգավորում նոր տարրն ավելացնելուց հետո
void add_aux( int, int );
// աղյուսակի կարգավորում նոր տարրը հեռացնելուց հետո
void remove_aux( int, int );
};
Դասի կոնստրուկտորի նպատակը նոր աղյուսակի ստեղծումն է, որի բոլոր բջիջները նախապես լրացված են \(\infty\) արժեքով։
Tabelau::Tabelau( int r, int c)
: rows{r}, columns{c}
{
data = new double*[rows];
for( int i = 0; i < rows; ++i ) {
data[i] = new double[columns];
for( int j = 0; j < columns; ++j )
data[i][j] = INFINITY;
}
}
Դեստրուկտորը պարզապես ազատում է զբաղեցրած հիշողությունը։
Tabelau::~Tabelau()
{
for( int i = 0; i < rows; ++i )
delete[] data[i];
delete[] data;
}
Աղյուսակի դատարկ լինելը ստուգվում է is_empty() մեթոդով, իսկ լցված լինելը՝ is_full() մեթոդով։
bool Tabelau::is_empty() const
{
return data[0][0] == INFINITY;
}
bool Tabelau::is_full() const
{
return data[rows-1][columns-1] != INFINITY;
}
Փոքրագույն տարրը վերադարձնում է minimum() մեթոդը․
double Tabelau::minimum() const
{
return data[0][0];
}
\(A\) Յունգի աղյուսակում նոր տարրն ավելացվում է \(A[rows-1,columns-1]\) բջջում, այնուհետև այն փոխատեղվում է իրենից վերևում և ձախում գտնվող տարրերից մեծագույնի հետ։ Նույնը կրկնվում է այնքան անգամ, քանի դեռ դիտարկվող տարրից վերև կամ ձախ գոյություն ունի ավելի մեծ արժեքով տարր։
void Tabelau::add( double val )
{
data[rows-1][columns-1] = val;
add_aux( rows-1, columns-1 );
}
Նոր տարրը \(A[rows-1,columns-1]\) բջջում գրառելուց հետո աղյուսակի կարգավորումը կատարվում է add_aux() ռեկուրսիվ մեթոդով։
void Tabelau::add_aux( int r, int c )
{
int k{r}, h{c};
if( r > 0 && data[r][c] < data[r-1][c] )
k = r - 1;
if( c > 0 && data[k][h] < data[r][c-1] )
k = r, h = c - 1;
if( k != r || h != c ) {
double temp{data[r][c]};
data[r][c] = data[k][h];
data[k][h] = temp;
add_aux( k, h );
}
}
Մինիմալ տարրը, որ միշտ գտնվում է \(A[0,0]\) բջջում, աղյուսակից հեռացնելու համար նրա տեղում գրվում է \(\infty\), և այդ պատճառով էլ խախտվում է Յունգի աղյուսակի հատկությունը։ Աղյուսակը նորից կարգավորելու համար պետք է \(\infty\) արժեքն այնքան ժամանակ տեղափոխել դեպի աջ կամ ներքև, քանի դեռ գոյություն ունի նրանից փոքր տարր։
void Tabelau::remove()
{
data[0][0] = INFINITY;
remove_aux( 0, 0 );
}
Տարրը հեռացնելուց հետո աղյուսակի կարգավորումը կատարվում է remove_aux() մեթոդով։
void Tabelau::remove_aux( int r, int c )
{
int k{r}, h{c};
if( r < rows - 1 && data[r][c] > data[r+1][c] )
k = r + 1;
if( c < columns - 1 && data[k][h] > data[r][c+1] )
k = r, h = c + 1;
if( k != r || h != c ) {
double temp{data[r][c]};
data[r][c] = data[k][h];
data[k][h] = temp;
remove_aux( k, h );
}
}
Թերևս այսքանը Յունգի աղյուսակների մասին։ Նշեմ նաև, որ այն հաճախ օգտագործվում է նախապատվություններով հերթերի կազմակերպման և կարգավորման heap-sort ալգորիթմների իրականացման համար։
No comments:
Post a Comment