ARBOLES MULTICAMINOS

6,025 views

Published on

ARBOLES MULTICAMINOS

Published in: Education
0 Comments
5 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
6,025
On SlideShare
0
From Embeds
0
Number of Embeds
37
Actions
Shares
0
Downloads
0
Comments
0
Likes
5
Embeds 0
No embeds

No notes for slide

ARBOLES MULTICAMINOS

  1. 1. ARBOLES MULTICAMINOS ESTRUCTURAS DE DATOS
  2. 2. INTRODUCCION <ul><li>Un arbol multimodal </li></ul><ul><ul><li>Es la generalizacion del Arbol Binario </li></ul></ul><ul><ul><li>Cada nodo puede almacenar n claves y tener n+1 hijos </li></ul></ul><ul><li>El arbol B es un tipo especial de arbol multimodal </li></ul><ul><ul><li>Es util en sistemas de Archivos y para manejar Sistemas de Bases de Datos </li></ul></ul><ul><ul><li>Permiten almacenar grandes cantidades de datos </li></ul></ul><ul><ul><ul><li>Que no entran en memoria secundaria </li></ul></ul></ul><ul><ul><li>Se aplica para la organización de indices o claves </li></ul></ul><ul><ul><ul><li>De tal forma que el acceso a esos datos </li></ul></ul></ul><ul><ul><ul><li>Usando dispositivos externos(no en memoria principal) </li></ul></ul></ul><ul><ul><ul><li>Tengan un costo relativamente bajo </li></ul></ul></ul>
  3. 3. CARACTERISTICAS <ul><li>Posee un orden m </li></ul><ul><ul><li>Este define el maximo de claves e hijos que cada nodo puede tener </li></ul></ul><ul><li>Cada nodo se denomina pagina </li></ul><ul><li>Es un arbol lleno( y balanceado) </li></ul><ul><ul><li>Todas sus hojas estan en el mismo nivel </li></ul></ul><ul><li>Cada página interna </li></ul><ul><ul><li>Posee maximo: m ramas </li></ul></ul><ul><ul><li>Y Minimo: m/2 ramas, redondeado </li></ul></ul><ul><ul><li>Si posee un numero n de ramas , puede almacenar hasta n-1 claves </li></ul></ul><ul><li>Y la raiz </li></ul><ul><ul><li>Tiene maximo: m ramas </li></ul></ul><ul><ul><li>Y minimo: 2 ramas, o 0 si solo existe el nodo raiz </li></ul></ul>
  4. 4. EJEMPLO <ul><li>Las ramas a la izq. de una clave x </li></ul><ul><ul><li>Almacenan claves menores que x </li></ul></ul><ul><li>Las ramas a la derecha de la ultima clave y </li></ul><ul><ul><li>Almacena claves mayores que y </li></ul></ul><ul><li>En cada pagina las claves se almacenan en orden </li></ul>P I L S X A C D J K M O Q R T U Y Z > P < P < I < L > L < S < X > X Arbol B de orden 5(4-5) Max: 5 ramas(4 claves) Min: 3 ramas(2 claves)
  5. 5. ESTRUCTURA DE LA PAGINA <ul><li>Tomemos como ejemplo un arbol 2-3 </li></ul><ul><ul><li>Claves Max: 2 </li></ul></ul><ul><ul><li>Ramas Max: 3 </li></ul></ul><ul><li>Que necesitamos? </li></ul><ul><ul><li>Cada Pagina almacenara maximo 2 claves </li></ul></ul><ul><ul><li>Cada Pagina tendra 3 punteros maximo, para sus ramas </li></ul></ul><ul><li>Podria ser: </li></ul>typedef struct{ Generico Claves[2]; Generico Contenido[2]; int nclaves; struct Pagina *izq, *centro, *der; }Pagina; F M
  6. 6. ESTRUCTURA FINAL <ul><li>En un arbol B no solo hay 3 ramas max. </li></ul><ul><li>Hay m ramas max. </li></ul><ul><ul><li>Donde m es el orden del arbol </li></ul></ul><ul><li>Tendriamos que remplazar los 3 punteros </li></ul><ul><ul><li>Por un arreglo de Punteros para las ramas </li></ul></ul><ul><li>Podria ser: </li></ul>#define MAX 3 typedef struct{ Generico Claves[MAX-1]; struct Pagina *Ramas[MAX]; int nramas; }Pagina; typedef Pagina * ArbolB; Ramas[0], valores menores que Claves[0] Ramas[1], valores menores que Claves[1] Ramas[2], valores menores que Claves[2] Ramas[3], valores mayores que Claves[2] F M S 0 1 2 0 1 2 3
  7. 7. OPERACIONES <ul><li>Los arboles B almacenan claves y contenido </li></ul><ul><ul><li>Insercion </li></ul></ul><ul><ul><li>Eliminacion </li></ul></ul><ul><li>Con el objetivo de minimizar costo en la </li></ul><ul><ul><li>Busqueda </li></ul></ul><ul><li>Los datos tambien se pueden Presentar </li></ul><ul><ul><li>Recorridos </li></ul></ul><ul><li>Y poseen las operaciones que todos los TDAs </li></ul><ul><ul><li>Vaciar </li></ul></ul><ul><ul><li>EstaVacio </li></ul></ul>
  8. 8. VACIAR Y ESTA VACIO <ul><li>El puntero a la pagina Raiz apunta a NULL </li></ul>void AB_Inicializar(ArbolB *raiz){ *raiz = NULL; } bool AB_EstaVacio(ArbolB raiz){ return(raiz == NULL); }
  9. 9. BUSQUEDA <ul><li>De acuerdo a la clave buscada hay que bajar por el arbol </li></ul>45 79 172 192 233 Buscar 192 Es menor que 45 ? 79 ? 172 ? 18 26 5 9 15 22 24 29 32 48 57 82 126
  10. 10. BUSQUEDA: IMPLEMENTACION Pagina *Buscar(ArbolB A, Generico clave, Generico_fnComparar fn, int *pos){ int i; if(EstaVacio(A)) return NULL; for(i = 0; i < A->nclaves;i++){ if(fn(A->Claves[i], clave)==0){ *pos = i; return(A); } if(fn(clave, A->Claves[i]) < 0) return(Buscar(A->Ramas[i],clave,fn, pos); } return(Buscar(A->Ramas[i],clave,fn,pos); }
  11. 11. RECORRIDOS <ul><li>PreOrden: R,I,D </li></ul><ul><ul><li>Primero se mostrara la clave </li></ul></ul><ul><ul><li>Luego recorrer la rama Izquierda </li></ul></ul><ul><ul><li>Solo la ultima clave tiene rama derecha </li></ul></ul><ul><li>InOrden: I,R,D </li></ul><ul><ul><li>Recorrer rama izquierda </li></ul></ul><ul><ul><li>Mostrar Raiz </li></ul></ul><ul><ul><li>Solo la ultima clave tiene rama derecha </li></ul></ul>
  12. 12. EJEMPLO PREORDEN 45 18 26 79 172 5 9 15 22 24 29 32 48 57 82 126 192 233
  13. 13. PREORDEN: IMPLEMENTACION void ArbolB_PreOrden(ArbolB A, Generico_fnImprimir fn){ int i; if(ArbolB_EstaVacio(A)) return(); for(i = 0; i < A->nclaves;i++){ fn(A->Claves[i]); PreOrden(A->Ramas[i], fn); } PreOrden(A->Ramas[i],fn); }
  14. 14. ALGORITMO DE INSERCION <ul><li>Si el arbol esta vacio </li></ul><ul><ul><li>Retornar la nueva clave que se iba a insertar y la nuevapag(NULL) </li></ul></ul><ul><ul><li>Indicar que si se debe seguir propagando la revision </li></ul></ul><ul><li>En la pagina dada, se busca en que rama se debe insertar la nueva clave </li></ul><ul><ul><li>Cuando se encuentre, y si hay espacio para insertar un nuevo elemento </li></ul></ul><ul><ul><ul><li>Meter la clave en la pagina y </li></ul></ul></ul><ul><ul><ul><li>La nuevapag como rama derecha nueva de la pagina </li></ul></ul></ul><ul><ul><ul><li>Indicar que ya no se debe seguir revisando mas arriba </li></ul></ul></ul><ul><ul><li>Si se encuentra la posicion en pagina y NO HAY espacio </li></ul></ul><ul><ul><ul><li>Dividir la pagina, creando nueva pagina nuevapag </li></ul></ul></ul><ul><ul><ul><li>Copiar mitad de las claves, incluyendo clave nueva en nuevapag </li></ul></ul></ul><ul><ul><ul><ul><li>Sin incluir clave mediana </li></ul></ul></ul></ul><ul><ul><ul><li>Retornar la clave mediana, la nuevapag creada e indicar que si se debe seguir revisando hacia arriba </li></ul></ul></ul><ul><ul><li>Repetir todo, hasta que haya espacio o se llegue a la raiz, </li></ul></ul><ul><ul><ul><li>En ese caso, se debe crear una nueva raiz con la clave mediana y añadir rama derecha como nuevapag </li></ul></ul></ul>
  15. 15. EJEMPLO <ul><li>En arbol de orden 5, insertar </li></ul><ul><ul><li>6, 11, 5, 4, 8, 9, 12, 21,14,10,19,28,3,17,15,32, 16,26,27 </li></ul></ul>Clave a Subir: 8 Pagina a Subir: NULL 8 no entra, hay que dividir, creando nueva pagina Clave a Subir: 6 6 Clave a Subir: 21 6 ya no tiene donde subir, se crea nueva raiz y se enlaza paigna a subir 21 no entra, hay que dividir, creando nueva pagina Subimos clave mediana hasta que entre en alguna pagina Clave a Subir: 11 Clave a Subir: 28 Clave a Subir: 19 Clave a Subir: 16 Clave a Subir: 15 Clave a Subir: 27 Clave a Subir: 27 No entra en la pagina raiz, pues ya esta llena, dividir Clave a Subir: 15 Ya llegamos a la raiz, no hay donde subir, crear nueva raiz y enlazar 15 4 5 6 11 4 5 8 11 8 11 8 9 11 12 8 9 12 21 6 11 12 21 12 14 21 8 9 10 12 14 19 21 12 14 21 28 21 28 6 11 19 4 5 3 12 14 15 17 21 28 32 16 17 12 14 16 17 6 11 15 19 21 26 28 32 21 26 28 32 6 11 19 27 28 32 19 27
  16. 16. CONCLUSION <ul><li>Recuerde que insertar es </li></ul><ul><ul><li>Buscar donde insertar (bajar por el arbol) </li></ul></ul><ul><ul><li>Dividir o Meter y </li></ul></ul><ul><ul><li>Decidir si se debe seguir propagando clave y nuevapag(subir) </li></ul></ul><ul><li>Al subir hay que informar si se propaga o no la division </li></ul><ul><ul><li>Ademas de informar que clave sube y la pagina que sube </li></ul></ul><ul><li>Si la propagacion llegase a la raiz </li></ul><ul><ul><li>Crear nueva raiz </li></ul></ul><ul><ul><li>Con clave que subio </li></ul></ul><ul><ul><li>Donde la Rama Izq. es la anterior raiz </li></ul></ul><ul><ul><li>Rama Derecha es la Pagina que sube </li></ul></ul>
  17. 17. IMPLEMENTACION void ArbolB_Insertar(ArbolB *A, Generico clave, Generico_fnComparar fn){ ArbolB NuevaRaiz; Pagina *PaginaSubir; Generico ClaveSubir; bool Propagar; Propagar = BuscarDividirOMeter(A,clave,&PaginaSubir, &ClaveSubir); if(Propagar){ NuevaRaiz = NuevaPagina(ClaveSubir); NuevaRaiz->Ramas[0] = *A; NuevaRaiz->Ramas[1] = PaginaSubir; *A = NuevaRaiz; } }
  18. 18. IMPLEMENTACION bool BuscarMeterODividir(ArbolB *A, Generico clave, ArbolB *PaginaSubir, Generico *ClaveSuribr, Generico_fnComparar fn){ Pagina *PagEncontrada; if(ArbolB_EstaVacio(*A)){ //Rebota la clave y la pagina a subir(NULL) *PaginaSubir = NULL; *ClaveSubir = clave; return(TRUE); } PagEncontrada = BuscarClaveEnPag(A, clave, &pos, fn); if(PagEncontrada) return FALSE; //No se permiten claves repetidas //Como no la encontre, bajar por el arbol por la rama adecuada Propagar = BuscarDividiryMeter(A->Ramas[pos],clave,PaginaSubir,ClaveSubir, fn); if(Propagar){ //Si hay que propagar, hay que intentar meter la clave en esta pagina if(A->nclaves < A->orden-1){ MeterClaveEnPagina(A, ClaveASubir, PaginaSubir,pos); return(FALSE); else{ Dividir(A, ClaveSubir, PaginaSuibr, pos); return(TRUE); } } }
  19. 19. ALGORITMO DE ELIMINACION <ul><li>Siempre se debera eliminar claves de paginas hojas </li></ul><ul><li>Si la la clave esta en una pag.interna </li></ul><ul><ul><li>Se busca su antecesora </li></ul></ul><ul><ul><ul><li>Mayor de los menores </li></ul></ul></ul><ul><ul><li>Se intercambia y se elimina la clave en pagina hoja </li></ul></ul><ul><li>Si esta en pagina hoja </li></ul><ul><ul><li>Se debe mantener el equilibrio </li></ul></ul>
  20. 20. ELIMINACION DE CLAVE EN HOJA <ul><li>Si luego de eliminar, quedan mas del minimo de claves por pag. </li></ul><ul><ul><li>Todo OK, se elimina facilmente </li></ul></ul><ul><li>Si quedan menos del minimo </li></ul><ul><ul><li>Se informa a la raiz del problema(a traves de un TRUE) </li></ul></ul><ul><ul><li>La raiz revisa si los hermanos de la pag. pueden prestar claves </li></ul></ul><ul><ul><ul><li>Sube clave a prestar </li></ul></ul></ul><ul><ul><ul><li>Baja clave intermedia de raiz </li></ul></ul></ul><ul><ul><li>Si no tiene para prestar </li></ul></ul><ul><ul><ul><li>Bajar clave de raiz y unir dos hermanos </li></ul></ul></ul><ul><ul><ul><li>Al hacer esto, la raiz puede quedar con menos claves y en ese caso propagar accion hacia mas arriba(a traves de un bool) </li></ul></ul></ul>
  21. 21. EJEMPLO <ul><li>Del siguiente arbol eliminar las claves 16, 24, 22 </li></ul>45 16 26 5 9 15 18 22 24 Reemplazar por Sucesor 18 Aun hay suf. Claves para eliminar Menos claves de las permitidas, eliminar e informar al padre La raiz decide que puede prestar de los hermanos 15 18 <ul><li>La raiz decide que NO puede prestar de los hermanos. </li></ul><ul><li>Bajar mediana </li></ul><ul><li>Unir dos paginas. </li></ul><ul><li>Si raiz se queda con menos de permitido </li></ul><ul><ul><li>Informa al padre </li></ul></ul>18 15 <ul><li>La raiz decide que NO puede prestar de los hermanos </li></ul><ul><li>Bajar mediana </li></ul><ul><li>Unir dos paginas </li></ul><ul><li>Esta nueva pagina sera la nueva raiz </li></ul>45 79 172 48 57 82 126 192 232 29 32 79 172
  22. 22. CONCLUSION <ul><li>Eliminar es </li></ul><ul><ul><li>Bajar por el arbol buscando la clave </li></ul></ul><ul><ul><li>Eliminar la clave de la pagina pase lo que pase </li></ul></ul><ul><ul><ul><li>E informar a la raiz si hubo problemas(seguir propagando) o no </li></ul></ul></ul><ul><ul><li>Fusionar y Propagar(Subir) </li></ul></ul><ul><li>Si se propaga hasta la raiz </li></ul><ul><ul><li>La nueva raiz sera la rama mas izquierda </li></ul></ul>
  23. 23. IMPLEMENTACION void ArbolB_Eliminar(ArbolB *A, Generico clave, Generico_fnComparar fn){ ArbolB tmp; bool Propagar; Propagar = BuscarEliminaroFusionar(A,I); if(Propagar){ tmp = A; *A = *A->Ramas[0]; free(tmp); } }
  24. 24. IMPLEMENTACION bool BuscarEliminaroFusionar(ArbolB *A, Generico clave, Generico_fnComparar fn) ArbolB PagEncontrada; ArbolB *sucesor; if(ArbolB_EstaVacio(*A)){ //La clave no existe return(FALSE); } PagEncontrada = BuscarClaveEnPag(*A, I, &pos, ,fn); if(PagEncontrada){ //Si esta en la pagina, eliminar if(ArbolB_EsHoja(*A)){ Remover(*A,pos); return(A->Ramas[pos].nclaves < min); } else{ sucesor = InterCambiarConSucesor(A,pos); Propagar = BuscarEliminaroFusionar(sucesor, clave, fn); } } else //Si no esta en la pagina, seguir bajando en el arbol por la rama correcta Propagar = BuscarEliminaroFusionar(A->Ramas[pos], I); if(Propagar) //Si hay que propagar, arreglar la pagina para prestar clave y fusionar if(!EsHoja(A)) && A->Ramas[pos].nclaves < min) return(Arreglar(A, pos )); } }

×