Anda di halaman 1dari 6

Organizacin de Archivos

Mara del Mar Regalado

Algoritmos para el manejo de un rbol B en disco.


Defincin de las Estructuras. MAXHIJOS = orden del rbol MAXLLAVES = MAXHIJOS - 1 MINLLAVES = MAXLLAVES DIV 2 NIL = -1 Definir_Tipo NODO_B CONTROL DATO DIRECCION DIRECCION Fin_Tipo Para la pgina Temporal CONT_LLAVES LLAVES [MAXLLAVES] REG-LOG [MAXLLAVES] HIJOS [MAXHIJOS] TMP_LLAVES [MAXLLAVES+1] TMP_REG_LOG [MAXLLAVES+1] TMP_HIJOS [MAXHIJOS+1]

Lista de los algoritmos para el manejo del rbol B en disco. 1. Inicializar una pgina. CONTROL INI_PAG (REF:NODO_B NVA_PAG) 2. Leer una pgina del disco. CONTROL LEE_PAG (VAL:DIRECCION REG_LOG,REF:NODO_B PAG) 3. Escribir una pgina en el disco. CONTROL ESCRIBE_PAG (VAL:DIRECCION REG_LOG,VAL:NODO_B PAG) 4. Buscar una llave en una pgina o la posicin que le corresponde (para bajar al siguiente nivel). CONTROL BUSCA_EN_PAG (VAL:DATO LLAVE,VAL:NODO_B PAG,REF:CONTROL POSICION) 5. Insertar una llave en una pgina recorriendo las dems para mantener el orden. CONTROL INS_EN_PAG (VAL:DATO LLAVE,VAL:DIRECCION REG_LOG,VAL:DIRECCION HIJO_DER,REF:NODO_B PAG, VAL:CONTROL POSICION) 6. Borrar una llave de una pgina y recorrer las dems. CONTROL BORRA_EN_PAG (REF:NODO_B PAG,VAL:CONTROL POSICION) 7. Reemplazar la llave en una pgina NO hoja por su sucesor (ms a la izquierda del subrbol derecho). CONTROL SUCESOR (REF:NODO_B PAG,VAL:CONTROL POSICION)

Organizacin de Archivos

Mara del Mar Regalado

8. Dividir una pgina en dos usando la temporal y promover una llave. CONTROL DIVIDE (VAL:DATO LLAVE,VAL:DIRECCION REG_LOG, VAL:DIRECCION HIJO_DER,REF:NODO_B PAGANT, REF:DATO PROMO_LLAVE, REF:DIRECCION PROMO_REG_LOG, REF:DIRECCION PROMO_HIJO, REF:NODO_B NVAPAG,REF:CONTROL POSICION) 1. Copiar llaves, registros lgicos e hijos a la pgina temporal. 2. Insertar la nueva llave en la pgina temporal. 3. Crear una nueva pgina para la divisin. 4. Inicializar la nueva pgina (NVAPAG). 5. Inicializar la pgina original (PAGANT). 6. Copiar la primera mitad a la original (PAGANT) y actualizar el contador de llaves. 7. Copiar la segunda mitad a la pgina nueva (NVAPAG) y actualizar el contador de llaves. 8. Asignar la llave, el registro de datos y el hijo (nm. reg. de la nueva pgina) a promover. 9. Mover una llave del hermano derecho hacia el hermano izquierdo. CONTROL MUEVE_IZQ (REF:NODO_B PAG, VAL:CONTROL POSICION, REF:NODO_B HNO_DER) 1. Leer al hermano izquierdo (LEE_PAG (PAG.HIJOS[POSICION], HNO_IZQ)) 2. Insertar la llave de la raz al final del hermano izquierdo. 3. Copiar HNO_DER.HIJOS[0] al final del hermano izquierdo. 4. Copiar la primera llave del hermano derecho a la raz. 5. Borrar la primera llave del hermano derecho ( BORRA_EN_PAG (HNO_DER,0)). 6. Grabar la pgina izquierda ( ESCRIBE_PAG (PAG.HIJOS[POSICION],HNO_IZQ). NOTA: La pgina del HNO_DER se graba en la funcin que hizo la llamada. 10. Mover una llave del hermano izquierdo hacia el hermano derecho. CONTROL MUEVE_DER (REF: NODO_B PAG, VAL:CONTROL POSICION, REF:NODO_B HNO_IZQ) 1. Leer al hermano derecho ( LEE_PAG (PAG.HIJOS[POSICION], HNO_DER)) 2. Insertar la llave de la raz al inicio del hermano derecho. 3. Copiar HNO_IZQ.HIJOS[ltimo] a HNO_DER.HIJOS[0]. 4. Copiar la ltima llave del hermano izquierrdo a la raz. 5. Borrar la ltima llave del hermano izquierdo ( BORRA_EN_PAG (HNO_IZQ,ltimo)). 6. Grabar la pgina derecha ( ESCRIBE_PAG (PAG.HIJOS[POSICION],HNO_DER). NOTA: La pgina del HNO_IZQ se graba en la funcin que hizo la llamada.

Organizacin de Archivos

Mara del Mar Regalado

11. Concatenar las llaves de las dos pginas con el padre. CONTROL CONCATENA (REF:NODO_B, PAG, VAL:CONTROL POSICION) 1. Leer al hermano izquierdo (LEE_PAG (PAG.HIJOS[POSICION], HNO_IZQ)) 2. Leer al hermano derecho ( LEE_PAG (PAG.HIJOS[POSICION+1], HNO_DER)) 3. Insertar la llave de la raz al final del hermano izquierdo. 4. Copiar todas las llaves del hermano derecho al final del hermano izquierdo. 5. Borrar la llave de la raz ( BORRA_EN_PAG (PAG,POSICION)). 6. Grabar la pgina izquierda ( ESCRIBE_PAG (PAG.HIJOS[POSICION],HNO_IZQ). 7. Marcar la pgina derecha o insertarla en la estructura que lleva el control para la reutilizacin.

Algoritmos principales para el manejo del rbol B en disco. CONTROL BUSCA (VAL:DIRECCION RAIZ,VAL:DATO LLAVE,REF:DIRECCION REG_DAT) # Busca una llave en el rbol B y devuelve el nmero de registro logico de datos.# NODO_B PAG CONTROL ESTA=0 CONTROL POS=-1 SI (RAIZ = NIL) ==> ESTA = 0 #La llave NO est.# SINO==> LEE_PAG (RAIZ,PAG) ESTA = BUSCA_EN_PAG (LLAVE,PAG,POS) SI (ESTA = 1) ==> REG_DAT = PAG.REG_LOG[POS] SINO==> #Llamada recursiva al siguiente nivel del rbol # ESTA = BUSCA (PAG.HIJOS[POS],LLAVE,REG_DAT) BUSCA=ESTA FIN_BUSCA

Organizacin de Archivos

Mara del Mar Regalado

CONTROL INSERTA (VAL:DIRECCION RAIZ,VAL:DATO LLAVE,VAL:DIRECCION REG_LOG, REF:DATO PROMO_LLAVE,REF:DIRECCION PROMO_REG_LOG, REF:DIRECCION PROMO_HIJO,REF:CONTROL DUPLICADA) #Inserta una llave en el rbol B, verificando si est duplicada# NODO_B PAG, NVA_PAG CONTROL ESTA = 0 CONTROL PROMOVIDA = 0 CONTROL POS = -1 # Variables para la promocin # DATO P_LLAVE DIRECCION P_REG_LOG DIRECCION P_HIJO SI (RAIZ = NIL) ==> # Se promueve la llave original para que se inserte en una hoja # PROMO_LLAVE = LLAVE PROMO_REG_LOG = REG_LOG PROMO_HIJO = NIL INSERTA = 1 SINO ==>LEE_PAG (RAIZ,PAG) ESTA = BUSCA_EN_PAG (LLAVE,PAG,POS) SI (ESTA = 1) ==> DUPLICADA = 1 INSERTA = 0 SINO==> #Llamada recursiva al siguiente nivel del rbol # PROMOVIDA = INSERTA (PAG.HIJOS[POS],LLAVE, REG_LOG, P_LLAVE, P_REG_LOG, P_HIJO,DUPLICADA) # A partir de este punto se ejecuta al regreso de la llamada recursiva. # SI (PROMOVIDA = 0) ==> INSERTA = 0 SINO ==> SI (PAG.CONT_LLAVES < MAXLLAVES) ==> # Insertar en esta pgina # INS_EN_PAG (P_LLAVE,P_REG_LOG,P_HIJO,PAG,POS) ESCRIBE_PAG (RAIZ,PAG) INSERTA = 0 #No hay promocin# SINO ==># No hay lugar en la pgina es necesario dividir y promover. # DIVIDE (P_LLAVE,P_REG_LOG,P_HIJO,PAG,PROMO_LLAVE, PROMO_REG_LOG,PROMO_HIJO,NVA_PAG,POS) ESCRIBE_PAG (RAIZ,PAG) ESCRIBE_PAG (PROMO_HIJO,NVA_PAG) INSERTA = 1 # S hay promocin. # FIN_INSERTA NOTA: La nueva raz se crea en la funcin que llama a INSERTA cuando esta funcin devuelva un 1.

Organizacin de Archivos

Mara del Mar Regalado

CONTROL REDISTRIBUYE (REF:NODO_B PAG, VAL:CONTROL POSICION) # Determina si los hermanos pueden prestar o es necesario concatenar y llama a las funciones correspondientes. # NODO_B PAG_AUX SI (POSICION>0) ==> # Tiene hermano izquierdo. # LEE_PAG (PAG.HIJOS[POSICION-1],PAG_AUX) SI (PAG_AUX.CONT_LLAVES > MINLLAVES) ==> # El hermano izquierdo puede prestar.# MUEVE_DER (PAG,POSICION,PAG_AUX) ESCRIBE_PAG (PAG.HIJOS[POSICION-1],PAG_AUX) SINO == > # Es necesario concatenar. # CONCATENA (PAG,POSICION-1) SINO ==> # No tiene hermano izquierdo, leer al derecho. # LEE_PAG (PAG.HIJOS[1],PAG_AUX) SI (PAG_AUX.CONT_LLAVES > MINLLAVES) ==> # El hermano derecho puede prestar.# MUEVE_IZQ (PAG,0,PAG_AUX) ESCRIBE_PAG (PAG.HIJOS[1],PAG_AUX) SINO == > # Es necesario concatenar. # CONCATENA (PAG,0) FIN_REDISTRIBUYE

Organizacin de Archivos

Mara del Mar Regalado

CONTROL ELIMINA (VAL:DIRECCION RAIZ, VAL:DATO LLAVE) # Elimina una llave del rbol B. # NODO_B PAG, PAG_AUX CONTROL ESTA = 0 CONTROL POS = -1 CONTROL TEMP = -1 SI (RAIZ = NIL) ==> ELIMINA = 0 # Lleg a una hoja y no est # SINO ==> LEE_PAG (RAIZ,PAG) ESTA = BUSCA_EN_PAG (LLAVE,PAG,POS) SI (ESTA = 1) ==> # Determinar si est en una hoja o no. # SI (PAG.HIJOS[POS]=NIL) ==> # Es una hoja. # BORRA_EN_PAG (PAG,POS) ESCRIBE_PAG (RAIZ,PAG) ELIMINA = 1 SINO ==> # Reemplazar por su sucesor. # SUCESOR (PAG,POS) ESCRIBE_PAG (RAIZ,PAG) # Hacer una llamada para borrar la llave de la hoja. # ESTA = ELIMINA (PAG. HIJOS[POS+1], PAG.LLAVE[POS]) TEMP = POS + 1 SINO ==> #Llamada recursiva al siguiente nivel del rbol. # ESTA = ELIMINA (PAG. HIJOS[POS],LLAVE) TEMP = POS # Determinar si es necesario redistribuir o combinar. # SI (PAG.HIJOS[TEMP] <> NIL) ==> LEE_PAG (PAG.HIJOS[TEMP],PAG_AUX) SI (PAG.AUX.CONT_LLAVES < MINLLAVES) ==> REDISTRIBUYE (PAG, TEMP) ESCRIBE_PAG (RAIZ,PAG) ELIMINA = ESTA FIN_ELIMINA

Anda mungkin juga menyukai