Académique Documents
Professionnel Documents
Culture Documents
Captulo 18
Pagodas. Seleccionar.
Una pagoda es una representacin de un rbol binario tal que los hijos tienen claves mayores o
iguales a las del padre. Es un algoritmo de seleccin que puede agregar tems en forma
dinmica, a diferencia del heap implcito, rbol binario embebido en un arreglo, que utiliza
memoria esttica.
18.1. Propiedades.
Cada nodo s de una pagoda contiene dos punteros i(s) y d(s) definidos como sigue:
(1) si s es la raz o es un hijo derecho: i(s) apunta al nodo ms izquierdista del subrbol de raz s.
(2) si s es un hijo izquierdo, i(s) apunta al padre de s.
El puntero d(s) est definido de una manera simtrica:
(1) si s es la raz o es un hijo izquierdo d(s) apunta al nodo ms derechista del subrbol de raz s.
(2) si s es un hijo derecho, d(s) apunta al padre de s.
Si se aplican las propiedades anteriores al rbol binario de prioridad, a la izquierda de la Figura
18.1, se obtiene la pagoda que se muestra a la derecha, de la misma Figura.
1
6
9
20-01-2010
2
8
20-01-2010
La insercin se logra mezclando una pagoda formada por un elemento con aquella en la que se
inserta el nuevo elemento. Esta forma de realizar la operacin cubre el caso en el cual el nuevo
elemento es el menor de todos.
n
9
8
20-01-2010
a
3
rn = NULL;
rn
2
lb
a
3
la
20-01-2010
rn->right = la;
//cierra lista circular
};
rn = la;
//la raz siempre apunta al menor
la = t;
//avanza por la derecha
Despus de ejecutado el segmento anterior, del cual se ejecuta el if, la Figura 18.7, muestra la
situacin:
rn
7
a
la
rn
la
rn
3
8
20-01-2010
rn
4
5
7
lb
2
20-01-2010
8
5
7
20-01-2010
20-01-2010
18.8. Descartar.
pnodo descartar( pnodo pq )
{
pnodo le, ri;
if ( pq==NULL ) {printf("Error: Descarte en pagoda vaca.\n"); return(NULL);}
else
{ /*** Encuentra le descendiente izquierdo de pq ***/
if ( pq->left == pq ) le = NULL;
else
{ le = pq->left;
while ( le->left != pq ) le = le->left;
le->left = pq->left;
};
/*** Encuentra ri descendiente derecho de pq ***/
if ( pq->right == pq ) ri = NULL;
else
{ ri = pq->right;
while ( ri->right != pq ) ri = ri->right;
ri->right = pq->right;
};
/*** mezcla pagodas ***/
//Debera usarse el elemento obtenido.
printf("%d ", pq->prioridad);
//Modo debug: el que se saca se imprime
free(pq);
return( merge( ri, le ) );
}
}
18.9. Insertar.
pnodo insertar( pnodo pq, int valor )
{ //forma pagoda con un elemento
pnodo nuevo=getnodo(valor);
return( merge( pq, nuevo ) );
}
Si se introducen los valores de los nodos en forma ascendente, se produce una lista circular
izquierda con todos los nodos menos la raz, y una derecha vaca. La pagoda degenera en una
lista circular. En este caso el costo de insertar n tems es O(n), ya que en cada insercin se
realiza una vez el ciclo while de la funcin mezclar; y el descarte es O(1), ya que una de las
listas circulares es vaca y no se ejecuta el ciclo while de la funcin mezclar.
En el ejercicio E1, se muestra un diseo alternativo de la insercin en una pagoda, la cual se
construye aplicando las propiedades de una pagoda, sin implementar en base a la operacin
mezclar.
20-01-2010
10
Ejercicios.
E18.1.
Verificar que la siguiente funcin inserta en una pagoda, cuya direccin es pasada por
referencia.
void enqueue(pnodo *r, int valor)
{ pnodo p, q=*r, n=getnodo(valor);
if (q==NULL) *r=n; //pagoda nula, insercin trivial
else
{ p=q->right;
Profesor Leopoldo Silva Bijit
20-01-2010
11
20-01-2010
12
}
return dequeue_result;
} /* dequeue */
Luego de usar el nodo, debera liberarse el espacio asociado al nodo.
20-01-2010
13
E18.3.
Verificar que las siguientes funciones implementan una cola de prioridad empleando una lista
simplemente enlazada, ordenada por el valor de prioridad.
typedef struct lista
{ int prioridad;
struct lista * proximo;
} nlista, *plista ;
plista getlista(int dato)
{ plista p=NULL;
if ( (p= (plista) malloc(sizeof(nlista))) ==NULL)
{ printf("Error: Memoria lista. \n"); exit(1);}
else { p->prioridad=dato; p->proximo=NULL; }
return(p);
}
//encola ordenado por prioridad.
//prioridades iguales en orden de llegada. Estable
plista encola (plista *p, int k )
{ plista p1, p2, p3;
if (*p==NULL)
{p1=getlista(k); *p=p1; return(p1);}
else
for( p2 = NULL, p1 = *p; p1 != NULL && p1->prioridad <=k; p2 = p1, p1 = p1->proximo );
p3= (plista) malloc (sizeof (nlista)) ;
if(p3!=NULL)
{ p3->prioridad = k;
if (p2 == NULL) { /* inserta al inicio */
p3->proximo = p1;
*p=p3;
}
else
{ p3->proximo = p2->proximo;
p2->proximo = p3;
}
}
return p3 ;
}
//desencola en lista ordenada.
plista desencola(plista *q)
{ plista t=*q;
if (t!=NULL)
{*q=t->proximo; return (t);}
Profesor Leopoldo Silva Bijit
20-01-2010
14
else return(NULL);
}
void prtcola(plista p)
{
for( ; p!=NULL; p=p->proximo)
printf( "%d ", p->prioridad);
putchar('\n');
}
E18.4.
Modificar las funciones para tener seleccin de mximo, en lugar de mnimo.
Referencias.
J. Francon, G. Viennot, and J. Vuillemin, Description and analysis of an efficient priority
queue representation, Proc. 19th Annual Symp. on Foundations of Computer Science. IEEE,
1978, pages 1-7.
Gaston H. Gonnet, R. Baeza-Yates, Handbook of Algorithms and Data Structures in Pascal
and C, Addison-Wesley Pub., May 1991.
Douglas W. Jones, An empirical comparison of priority queue and even-set implementations,
Communications of the ACM, April 1986 Volume 29 Number 4.
20-01-2010
15
ndice general.
CAPTULO 18 ........................................................................................................................................... 1
PAGODAS. SELECCIONAR. .................................................................................................................. 1
18.1. PROPIEDADES. ................................................................................................................................. 1
18.2. LISTAS CIRCULARES DE LA RAZ DE UNA PAGODA............................................................................ 2
18.3. MEZCLA DE PAGODAS. ..................................................................................................................... 2
18.4. ANLISIS DE LA MEZCLA. ................................................................................................................ 3
18.5. DEFINICIN DE TIPOS. ...................................................................................................................... 7
18.6. CREACIN DE NODO......................................................................................................................... 7
18.7. FUNCIN MEZCLAR. ......................................................................................................................... 7
18.8. DESCARTAR. .................................................................................................................................... 9
18.9. INSERTAR. ....................................................................................................................................... 9
18.10. MOSTRAR LISTAS CIRCULARES DE LA RAZ DE UNA PAGODA. ...................................................... 10
18.11. TEST DE LAS FUNCIONES. ............................................................................................................. 10
EJERCICIOS. ............................................................................................................................................ 10
E18.1. ................................................................................................................................................ 10
E18.2. ................................................................................................................................................ 11
E18.3. ................................................................................................................................................ 13
E18.4. ................................................................................................................................................ 14
REFERENCIAS. ........................................................................................................................................ 14
NDICE GENERAL. ................................................................................................................................... 15
NDICE DE FIGURAS................................................................................................................................. 15
ndice de figuras.
FIGURA 18.1. RBOL DE PRIORIDAD Y PAGODA EQUIVALENTE. ................................................................... 1
FIGURA 18.2. PAGODAS. .............................................................................................................................. 2
FIGURA 18.3. PAGODA Y SUS LISTAS CIRCULARES PRINCIPALES. ................................................................. 2
FIGURA 18.3A. PAGODA CON UN ELEMENTO. ............................................................................................... 3
FIGURA 18.4. SUBPAGODAS DE LA RAZ, DE LA FIGURA 18.3. ...................................................................... 3
FIGURA 18.5. LISTAS CIRCULARES DE LAS PAGODAS QUE SE DESEA MEZCLAR............................................. 4
FIGURA 18.6. INICIO DE LISTAS CIRCULARES DESCENDENTES. ..................................................................... 4
FIGURA 18.7. DESPUS DE INSERTADO EL 7. ................................................................................................ 5
FIGURA 18.8. DESPUS DE INSERTADO EL 5, LUEGO DEL ELSE. .................................................................... 5
FIGURA 18.9. DESPUS DE INSERTADO EL 5. ................................................................................................ 5
FIGURA 18.10. FORMACIN DE PAGODAS, DESPUS DE AGREGAR LOS NODOS: 4, 3...................................... 6
FIGURA 18.11. RESTO DE LISTA CIRCULAR IZQUIERDA................................................................................. 6
FIGURA 18.12. MEZCLA DE LAS PAGODAS DE LA FIGURA 18.4..................................................................... 7
20-01-2010