Vous êtes sur la page 1sur 15

Programacin IV

Programacin IV Clase Terica N 7 Estructuras de Datos para Simulacin de Eventos. Colas Binomiales.
Objetivos Al final de la clase los estudiantes sern capaces de: Analizar y aplicar estructuras de datos para la simulacin de eventos de espera: Colas Binomiales, Skew Heaps, Fibonacci Heaps. Codificar estas estructuras de datos en C#. Desarrollo Colas de Prioridad. Qu es una cola con prioridad? En una cola con prioridad los elementos se insertan segn un cierto orden de forma que el que tiene ms prioridad segn un cierto criterio se atiende siempre en primer lugar. Las colas de prioridad nos permiten modelizar: La gestin de un planificador de tareas en un SMU. Los trabajos que consumen menos recursos. Los trabajos del administrador del sistema. La gestin de los trabajos enviados a impresin. Los trabajos ms importantes primero. Los trabajos ms cortos primero. Antes de definir que es una cola binomial, recordaremos un poco lo que son los rboles binomiales.

rbol Binomial. Es un rbol ordenado definido de la siguiente manera

B0: un nico nodo Bk: dos rboles binomiales Bk-1 enlazados a la raiz de uno se convierte en el hijo ms izquierdo de la raiz del otro.

UDB Ciclo 01 - 2012

______________________________________________________________________________________________________________ 94

Programacin IV

Ejemplos:

Colas Binomiales. Son una estructura de datos que permite mezclar, insertar y borrar en tiempo de ejecucin O (log N) en el peor caso, pero donde insertar toma O (1) en promedio. A diferencia de otras implementaciones de colas de prioridad, no es un rbol sino que es una coleccin de rboles (un bosque). Existe solo un rbol binomial para cada altura. Un rbol de orden Bk se forma insertando un rbol de tamao Bk1 en la raz de otro rbol de tamao Bk 1. Una cola binomial C es un conjunto de rboles binomiales que satisface las siguientes propiedades: 1. Cada rbol binomial en C obedece la propiedad de heap; el valor de cada nodo es mayor o igual que el de su padre. 2. Para todo entero no negativo k, existe en C a lo sumo un rbol binomial cuya raz tiene grado k. 3. Una cola binomial C de n nodos consiste como mximo de Log n + 1 rboles binomiales (races). La Cola Binomial reparte los nodos en un conjunto de rboles, no directamente conectados entre s, dando origen a un bosque. Los rboles son del tipo conocido como rbol binomial. No son binarios y se ajustan a ciertas restricciones que facilitan las operaciones: 1) Verifican la propiedad de Heap. 2) Cada uno de ellos aloja, un nmero de nodos igual a 2k, con k = 0, 1, 2, ... Designando a cada rbol de 2k nodos como Bk, B0 resulta ser un rbol de un solo nodo, mientras que todo rbol Bj se puede obtener "agregando" un rbol Bj-1 a otro rbol Bj-1. La Figura. 1 ilustra algunos casos.

FIGURA 1 rboles Binomiales

La segunda propiedad implica que una cola binomial C de n nodos consiste como mximo de [log n] + 1 rboles binomiales (races).

UDB Ciclo 01 - 2012

______________________________________________________________________________________________________________ 95

Programacin IV

La representacin binaria de n tiene [Log n] +1 bits.

<b[Log n], b[Log n]-1, , b0>, tal que n = i=0[Log n] bi2i


Bi aparece en C entonces, el bit bi = 1 La cola binomial C tiene a lo sumo [log n]+1 rboles Binomiales Ejemplo: Una cola binomial compuesta por B0, B2 y B3

C tiene 13 nodos. La representacin binaria de 13 es <1101>. C est compuesta por los rboles B3, B2, B0 con 8, 4 y 1 nodos respectivamente. Generalmente las colas binomiales se implementan utilizando listas doblemente enlazadas para que el agregado o eliminacin de una raz pueda hacerse eficientemente. Adems se mantiene un puntero a la raz ms pequea. Visualizacin:

El principio fundamental en el cual se apoya la Cola Binomial es aquel segn el cual todo nmero entero N puede representarse, de manera nica, mediante la suma de no ms de log2 N sumandos de la forma 2x, para x = 0, 1, 2, .... Si el entero a descomponer es n, o sea la cantidad total de nodos, existe entonces un nico bosque de rboles binomiales que permite alojarlos. Luego, sin perjuicio de que los nodos puedan ocupar distintas posiciones, dando as origen a diferentes Colas Binomiales, la cantidad y dimensin de rboles binomiales es nica para cada valor de n. As por ejemplo n = 13 deber implementarse mediante el bosque { B3, B2, B0 }.

UDB Ciclo 01 - 2012

______________________________________________________________________________________________________________ 96

Programacin IV

Por extensin de esta ltima notacin se puede representar la estructura de la Cola Binomial para n = 13 mediante el nmero 1101, atendiendo al hecho de que existe un rbol de k = 3, uno de k = 2, ninguno de k = 1 y uno de k = 0. El hecho de que 1101 es la notacin binaria del decimal 13 confirma lo anticipado en cuanto a que la descomposicin es nica.

Operaciones sobre Colas Binomiales. Crear. Insertar. Mnimo. ExtraerMin. Unin. DisminuirClave.

Unin de Colas Binomiales. 1. Primero se mezclan las dos colas binomiales C1 y C2 en una lista C con los rboles de C1 y C2 ordenados por grado en orden creciente. C tendr como mximo 2 rboles binomiales de grado k para todo k. Si C1 y C2 tienen en total m rboles binomiales esto toma tiempo en O (m). 2. En una segunda etapa se enlazan los rboles binomiales de igual grado hasta que quede a lo sumo uno de cada grado. Inicialmente se cuentan los B0s de la lista, a) No hay ninguno: no se hace nada. b) Hay solo 1: se mantiene como parte del resultado. c) Hay 2: se los enlaza para obtener un B1. Luego se contina este proceso con cada Bi. En cada paso puede haber un Bi obtenido como resultado de la unin de dos Bi-1 en el paso anterior. Se cuentan los Bi: a) No hay ninguno: no se hace nada b) Hay solo 1: se lo mantiene como parte del resultado c) Hay 2 3: En cualquiera de estos casos se enlaza dos Bi formando un Bi+1; si queda un Bi se lo conserva como parte del resultado Ejemplo: Colas C1 y C2

UDB Ciclo 01 - 2012

______________________________________________________________________________________________________________ 97

Programacin IV

Se mezclan en una lista ordenada, as:

Se buscan los B0s:

Se transforman en un B1, de la siguiente forma:

Y luego se une la lista, y as sucesivamente se buscan luego los B2, B3 y B4 Luego la cola resultante se muestra a continuacin:

UDB Ciclo 01 - 2012

______________________________________________________________________________________________________________ 98

Programacin IV

Crear. Esta operacin crea una cola binomial vaca. Insertar. Insertar tiene como eficiencia O (log n). Insertar(x, C) inserta el nodo x en la cola C. Se crea un B0 con el nodo x como nico nodo en tiempo O (1) y luego se unen ambas colas en tiempo O(Log n).

Mnimo. Mnimo tiene como eficiencia O (1). Si se mantiene un enlace a la raz con el mnimo valor, entonces toma O (1). En caso contrario se debe buscar el mnimo entre los nodos races. Dado que se deben chequear a lo sumo log n + 1 races, esta implementacin toma O (log n).

ExtraerMin. ExtraerMin tiene como eficiencia O(log n) ExtraerMin(C) encuentra el nodo con menor valor de la cola C y lo retorna eliminndolo de C previamente. 1. Se obtiene el rbol con la raz de menor clave y se lo elimina de C. 2. Se elimina la raz del rbol obteniendo un conjunto de rboles binomiales, sus hijos. 3. Se crea una nueva cola binomial C con estos rboles en orden inverso. 4. Se unen C y lo que queda de C. Sea n la cantidad de nodos de C: Obtener el rbol con la menor raz y eliminarlo de C: O(1). Eliminar la raz y crear la cola C con sus hijos: O(log n). Unir C y C: O (log n) Entonces en el peor caso ExtraerMin tiene eficiencia O(log n). Ejemplo: Dado el rbol binomial mostrado en la figura siguiente, eliminar el elemento mnimo.

UDB Ciclo 01 - 2012

______________________________________________________________________________________________________________ 99

Programacin IV

Se extrae el rbol con la raz de menor valor, as:

: A continuacin se separa la raz obteniendo los hijos de min:

Se crea la nueva cola binomial C, como se observa en la figura siguiente:

Luego, se aplica el procedimiento de unin de rboles binomiales para C y C:

UDB Ciclo 01 - 2012

______________________________________________________________________________________________________________ 100

Programacin IV

Se buscan los B1 y se convierten en B2 , luego se buscan los B2 y como se encuentran 3, se unen 2 de ellos para formar un B3, el cual se une con el otro B3 para formar un B4; el resultado se muestra en la figura 2 a continuacin:

Figura 2

DisminuirClave. DisminuirClave tiene como eficiencia O (log n). DisminuirClave(C, x, k) disminuye el valor de la clave del nodo 2x con el nuevo valor k. 1. Se inicializan dos punteros y -> x, z -> padre[y]. 2. Se actualiza el valor de la clave de x con el valor k. 3. Mientras la clave de y sea menor que la de z: a) se intercambian los valores de z e y b) se actualizan los punteros y -> z; z -> padre[z] Sea n la cantidad de nodos de C, la mxima posible profundidad de x es log n. Se realizan como mximo log n iteraciones para subir la nueva clave. Entonces DisminuirClave tiene eficiencia O (log n). Ejemplo: En el rbol binomial mostrado en la siguiente figura, DisminuirClave(C, x, 7).

Se inicializan los punteros z e y, de la siguiente forma:

UDB Ciclo 01 - 2012

______________________________________________________________________________________________________________ 101

Programacin IV

Se actualiza el valor de x (y), as:

Mientras key[y] key[z], intercambiar valores y actualizar punteros, de esta forma:

Subimos un nivel y ahora se tiene que key[y] key[z]:

UDB Ciclo 01 - 2012

______________________________________________________________________________________________________________ 102

Programacin IV

El rbol binomial resultante se muestra en la figura 3:

Figura 3

Antes de entrar a analizar inserciones y remociones cabe destacar un hecho importante: se dice que todos los rboles verifican la propiedad de Heap, razn por la cual el nodo de ms bajo valor de t de la Cola Binomial ser el nodo raz de alguno de sus rboles, y dado que hay un mximo de log2 N rboles, esa ser la cota (medida en nmero de comparaciones) para determinar el nodo a remover. Si slo se trata de conocer la ubicacin del nodo que ostenta el menor valor de t pero sin intencin de removerlo, hay un modo todava ms rpido y simple que barrer los nodos raz de los rboles. Consiste sencillamente en mantener un puntero al mismo, actualizndolo luego de inserciones y remociones. Slo la actualizacin por remocin puede adicionar un pequeo costo, pero fuera de ello se puede conseguir prcticamente una determinacin O (1). Al igual que en otras tantas implementaciones relacionadas al Heap, las dos operaciones fundamentales se resuelven a travs de una tercera, de fusin o merge de dos Colas Binomiales, siendo sta la que se comenta seguidamente. El merge entre dos rboles binomiales se realiza en tiempo constante puesto que la nica dificultad se reduce a determinar cual de ellos tiene menor valor de t en el nodo raz. Luego se le conecta el otro como subrbol, colgado de la raz mediante un nuevo enlace, tal como se muestra en Figura 4 (este criterio responde al hecho de que el rbol resultante debe verificar la condicin de Heap).

FIGURA 4 Merge de dos rboles Binomiales

La heurstica de la operacin merge debe contemplar que, an cuando sean factibles geomtricamente fusiones de rboles cualesquiera, no todas las combinaciones son posibles sino slo aquellas que dan por resultado un rbol con 2k nodos (por ejemplo, no tiene sentido el merge entre los rboles B1 y B2).

UDB Ciclo 01 - 2012

______________________________________________________________________________________________________________ 103

Programacin IV

El algoritmo de merge entre Colas Binomiales debe reconocer el conjunto de todos los rboles de que dispone, determinar los rboles que deber contener la Cola Binomial resultante e ir haciendo sucesivos merges entre los rboles disponibles en todo momento, esto es entre los originales de las dos Colas Binomiales a fusionar y/o los que se vayan generando durante el proceso. Supngase la fusin de BQ1= {B2, B1} con BQ2= {B2, B1, B0}, o sea dos Colas Binomiales de 6 y 7 nodos respectivamente. Independientemente de los valores de t de sus nodos es seguro que el merge tendr una composicin BQ3= {B3, B2, B0}, o lo que es lo mismo, 13 nodos. El proceso puede resumirse en los siguientes pasos, teniendo en cuenta que el Objetivo se debe armar comenzando por los rboles ms pequeos, pudiendo resultar que estos existan entre los Disponibles o que se vayan obteniendo mediante la fusin de dos de ellos. 1) Disponibles: 1 B0, 2 B1 y 2 B2. Objetivo B0. Inmediato. 2) Disponibles: 2 B1 y 2 B2. Objetivo B2. Ya no harn falta rboles B1 en el Objetivo, por lo que corresponde primeramente convertir a los dos existentes en nico B2, quedando la situacin modificada a, 3) Disponibles: 3 B2. Objetivo B2. Se elige el de menor valor de t en el nodo raz. 4) Disponibles: 2 B2. Objetivo B3. Inmediato. Una insercin se resuelve mediante merge entre la Cola Binomial existente y otra formada nicamente por el nodo a insertar como B0. Una remocin debe primeramente localizar el rbol con menor valor de t en su raz, supngase que sea de tipo Bk. Al removerlo, para ser devuelto por la funcin, se generarn los rboles B0, B1, B2,..., Bk-1, que sern reconocidos como una Cola Binomial aparte. Entre ella y lo que quedara de la original se hace merge para restituir una nica. Ventajas: El uso de Colas proporciona una solucin a problemas de rboles. Desventajas: Esta estructura de datos se complica porque no solamente es un rbol sino que es una coleccin de rboles.

Cdigo en C++ #include "binomial.h" #include "fatal.h" typedef struct BinNode *Position; struct BinNode { ElementType Element; Position LeftChild; Position NextSibling; };

UDB Ciclo 01 - 2012

______________________________________________________________________________________________________________ 104

Programacin IV

struct Collection { int CurrentSize; BinTree TheTrees[ MaxTrees ]; }; BinQueue Initialize( void ) { BinQueue H; int i; H = malloc( sizeof( struct Collection ) ); if ( H == NULL ) FatalError( "Out of space!!!" ); H->CurrentSize = 0; for( i = 0; i < MaxTrees; i++ ) H->TheTrees[ i ] = NULL; return H; } static void DestroyTree( BinTree T ) { if ( T != NULL ) { DestroyTree( T->LeftChild ); DestroyTree( T->NextSibling ); free( T ); } } void Destroy( BinQueue H ) { int i; for( i = 0; i < MaxTrees; i++ ) DestroyTree( H->TheTrees[ i ] ); } BinQueue MakeEmpty( BinQueue H ) { int i; Destroy( H ); for( i = 0; i < MaxTrees; i++ ) H->TheTrees[ i ] = NULL; H->CurrentSize = 0; return H; } BinQueue Insert( ElementType Item, BinQueue H ) { BinTree NewNode; BinQueue OneItem; NewNode = malloc( sizeof( struct BinNode ) ); if( NewNode == NULL ) FatalError( "Out of space!!!" ); NewNode->LeftChild = NewNode->NextSibling = NULL;

UDB Ciclo 01 - 2012

______________________________________________________________________________________________________________ 105

Programacin IV

NewNode->Element = Item; OneItem = Initialize( ); OneItem->CurrentSize = 1; OneItem->TheTrees[ 0 ] = NewNode; return Merge( H, OneItem ); } ElementType DeleteMin( BinQueue H ) { int i, j; int MinTree; /* The tree with the minimum item */ BinQueue DeletedQueue; Position DeletedTree, OldRoot; ElementType MinItem; if( IsEmpty( H ) ) { Error( "Empty binomial queue" ); return -Infinity; } MinItem = Infinity; for( i = 0; i < MaxTrees; i++ ) { if( H->TheTrees[ i ] && H->TheTrees[ i ]->Element < MinItem ) { MinItem = H->TheTrees[ i ]->Element; /* Update minimum */ MinTree = i; } } DeletedTree = H->TheTrees[ MinTree ]; OldRoot = DeletedTree; DeletedTree = DeletedTree->LeftChild; free( OldRoot ); DeletedQueue = Initialize( ); DeletedQueue->CurrentSize = ( 1 << MinTree ) - 1; for( j = MinTree - 1; j >= 0; j-- ) { DeletedQueue->TheTrees[ j ] = DeletedTree; DeletedTree = DeletedTree->NextSibling; DeletedQueue->TheTrees[ j ]->NextSibling = NULL; } H->TheTrees[ MinTree ] = NULL; H->CurrentSize -= DeletedQueue->CurrentSize + 1; Merge( H, DeletedQueue ); return MinItem; /* END */

ElementType FindMin( BinQueue H ) { int i; ElementType MinItem; if( IsEmpty( H ) )

UDB Ciclo 01 - 2012

______________________________________________________________________________________________________________ 106

Programacin IV

{ Error( "Empty binomial queue" ); return 0; } MinItem = Infinity; for( i = 0; i < MaxTrees; i++ ) { if( H->TheTrees[ i ] && H->TheTrees[ i ]->Element < MinItem ) MinItem = H->TheTrees[ i ]->Element; } return MinItem; } int IsEmpty( BinQueue H ) { return H->CurrentSize == 0; } int IsFull( BinQueue H ) { return H->CurrentSize == Capacity; } BinTree CombineTrees( BinTree T1, BinTree T2 ) { if( T1->Element > T2->Element ) return CombineTrees( T2, T1 ); T2->NextSibling = T1->LeftChild; T1->LeftChild = T2; return T1; } /* END */ /* Merge two binomial queues */ /* Not optimized for early termination */ /* H1 contains merged result */ BinQueue Merge( BinQueue H1, BinQueue H2 ) { BinTree T1, T2, Carry = NULL; int i, j; if( H1->CurrentSize + H2->CurrentSize > Capacity ) Error( "Merge would exceed capacity" ); H1->CurrentSize += H2->CurrentSize; for( i = 0, j = 1; j <= H1->CurrentSize; i++, j *= 2 ) { T1 = H1->TheTrees[ i ]; T2 = H2->TheTrees[ i ]; switch( !!T1 + 2 * !!T2 + 4 * !!Carry ) { case 0: /* No trees */ case 1: /* Only H1 */ break; /* Return the result of merging equal-sized T1 and T2 */

UDB Ciclo 01 - 2012

______________________________________________________________________________________________________________ 107

Programacin IV

case 2: /* Only H2 */ H1->TheTrees[ i ] = T2; H2->TheTrees[ i ] = NULL; break; case 3: /* H1 and H2 */ Carry = CombineTrees( T1, T2 ); H1->TheTrees[ i ] = H2->TheTrees[ i ] = NULL; break; case 4: /* Only Carry */ H1->TheTrees[ i ] = Carry; Carry = NULL; break; case 5: /* H1 and Carry */ Carry = CombineTrees( T1, Carry ); H1->TheTrees[ i ] = NULL; break; case 6: /* H2 and Carry */ Carry = CombineTrees( T2, Carry ); H2->TheTrees[ i ] = NULL; break; case 7: /* All three */ H1->TheTrees[ i ] = Carry; Carry = CombineTrees( T1, T2 ); H2->TheTrees[ i ] = NULL; break; } } return H1; }

UDB Ciclo 01 - 2012

______________________________________________________________________________________________________________ 108

Vous aimerez peut-être aussi