Pagini recente » Istoria paginii utilizator/cmarius46 | Istoria paginii problema/zigsort | Diferente pentru utilizator/moise_alexandru intre reviziile 49 si 7 | Istoria paginii utilizator/amdb | Diferente pentru treapuri intre reviziile 19 si 20
Diferente pentru
treapuri intre reviziile
#19 si
#20
Nu exista diferente intre titluri.
Diferente intre continut:
int key;
int priority;
T *left, *right;
} *R, *nil; // R radacina; nil arata un nod `gol`
} *R, *nil;
void init(T* &R)
{
srand(unsigned(time(0)));
R = nil = new T();
nil->key = nil->priority = 0,
nil->left = nil->right = NULL;
}
void rotleft(T* &n) // roteste fiul stang
void rotleft(T* &n)
{
T *t = n->left;
n->left = t->right, t->right = n;
n = t; // noua radacina
n = t;
}
void rotright(T* &n) // roteste fiul drept
void rotright(T* &n)
{
T *t = n->right;
n->right = t->left, t->left = n;
n = t; // noua radacina
n = t;
}
void balance(T* &n) // restabileste invariantul heapurilor
void balance(T* &n)
{
// balance() e apelat dupa un insert(), astfel doar cel mult unul din cei doi fii nu respecta invariantul heapurilor
if (n->left->priority > n->priority)
rotleft(n);
else if (n->right->priority > n->priority)
rotright(n);
// altfel nu face nimic
}
void insert(T* &n, int key) // insereaza cheia 'key'
void insert(T* &n, int key)
{
if (n == nil)
{
// adaugam cheia 'key' prin crearea unui nou nod
n = new T();
n->key = key, n->priority = rand() + 1,
n->left = n->right = nil;
insert(n->left, key);
else if (key > n->key)
insert(n->right, key);
// altfel e un duplicat; nu face nimic
balance(n);
}
erase(n->left, key);
else if (key > n->key)
erase(n->right, key);
else { // am gasit cheia
// pune fiul cu prioritatea cea mai mare ca radacina in locul lui 'n'
else {
(n->left->priority > n->right->priority) ? rotleft(n) : rotright(n);
if (n != nil) // continua
if (n != nil)
erase(n, key);
else {
delete n->left;
}
}
void _empty(T* &n)
{
if (n != nil)
{
_empty(n->left), _empty(n->right);
delete n;
}
}
void empty(T* &R)
{
_empty(R), R = nil;
}
void print(T *n)
{
if (n != nil)
{
print(n->left);
printf("%d ", n->key);
print(n->right);
}
}
int main(void)
{
init(R);
// 1 s pentru a insera un milion de numere
for (int i = 1 << 20; i >= 1; -- i)
insert(R, i);
// 0.5 s pentru a sterge un milion de numere
for (int i = 1; i <= 1 << 20; ++ i) if (i < 11 || i > 25)
erase(R, i);
print(R);
empty(R);
print(R);
return 0;
}
==
Nu exista diferente intre securitate.
Topicul de forum nu a fost schimbat.