630 likes | 1.03k Vues
IBD. Clase 6. Árboles. Índices: problemas Indices grandes -> mem. secundaria Acceso a mem. secundaria -> lento Búsqueda binaria -> demasiados desplazamientos En un índice de 1000 items se requieren 9.5 (aprox.) desplazamientos en promedio Costo de mantener índice ordenado
E N D
IBD Clase 6
Árboles • Índices: problemas • Indices grandes -> mem. secundaria • Acceso a mem. secundaria -> lento • Búsqueda binaria -> demasiados desplazamientos • En un índice de 1000 items se requieren 9.5 (aprox.) desplazamientos en promedio • Costo de mantener índice ordenado • Es necesario un método donde las reorganizaciones sean locales y no masivas IBD - CLASE 6
Arboles • Arbol: Estructura de datos que permiten localizar en forma más rápida información de un archivo. (usando esta estructura para los indices) • Tipos de árboles • Binarios • AVL • Multicamino • Balanceado (B, B*, B+) IBD - CLASE 6
MiEmpresa Ventas Producción I+D ES Internacional Portátiles Sobremesa Europa Asia América Arboles • Estructura JERÁRQUICA no lineal • Relaciones padre-hijo entre nodos • Ejemplos: sistema de ficheros, estructura de un libro, diagrama de clases JAVA, diagrama organizativo... IBD - CLASE 6
Arboles • Un árbol se caracteriza por estar formado por una serie de nodos conectados por una serie de aristas que verifican que: • hay un único nodo raíz • cada nodo, excepto la raíz, tiene un único padre • hay un único camino (desde la raíz hasta cada nodo) IBD - CLASE 6
Arboles • Un árbol de tipo base T es: • la estructura vacía, o • un nodo de tipo T con un número finito de estructuras árbol de tipo base T disjuntas llamadas subárboles <arbol> ::= <<nulo>> | <nodo> <nodo> ::= <info> {<arbol>} • Puede estar ordenado o no IBD - CLASE 6
Arboles: terminología básica A Raíz: único nodo sin padre Nodo interno: tiene al menos un hijo Nodo hoja (externo): no tiene hijos Descendiente directo: hijo Descendientes: hijo, nieto... Subárbol: árbol formado por un nodo y sus descendientes subárbol B C D E G H F K I J IBD - CLASE 6
Arboles: terminología básica • Grado de un nodo: número de descendientes directos • Grado del árbol: mayor grado de sus nodos • Árbol binario: árbol de grado 2 • Cada nodo tiene a lo sumo dos descendientes directos • Árbol multicamino: • Cada nodo puede tener n descendientes directos • Lista= árbol degenerado de grado 1 IBD - CLASE 6
Arboles: terminología básica • Profundidad de un nodo: número de predecesores • Altura del árbol: profundidad máxima de cualquier nodo A profundidad(A)=0 profundidad(H)=2 altura=3 B C D E G H F K I J IBD - CLASE 6
Arboles: terminología básica • Camino: existe un camino del nodo X al nodo Y, si existe una sucesión de nodos que permitan llegar desde X a Y. camino(A,K)={A,B,F,K} camino(C,K)={} A B C D E G H F K I J IBD - CLASE 6
Arboles: árbol binario • Es un árbol de grado 2 • Cada nodo tiene de 0 a 2 descendientes directos: el hijo izquierdo y el derecho <arbol> ::= <<nulo>> | <nodo> <nodo> ::= <info> <izq> <der> <izq> ::= <arbol> <der> ::= <arbol> A C B D E F G I H IBD - CLASE 6
Arboles: árbol binario • Aplicación: expresiones aritméticas, árboles de decisión, búsqueda (ABB) • En algunos casos se exige que el árbol sea completo = todo nodo interno tiene dos descendientes. Árbol binario completo Árbol binario no completo IBD - CLASE 6
Arboles: árbol binario • Ejemplo: expresiones aritméticas • nodo interno: operadores • nodos hoja: operandos 2*(a-1)+3*b + 2 - 3 b a 1 IBD - CLASE 6
Arboles: árbol binario • Ejemplo de aplicación: árboles de decisión • nodo interno: preguntas con respuesta si/no • nodos hoja: decisiones • ¿Dónde cenamos? ¿Cómida rápida? No Sí ¿Con café? ¿Cara? Sí No Sí No Rodizio Trattoría McDonalds Pizza hut IBD - CLASE 6
Arboles: árbol binario • Ejemplo: dada una lista de claves ordenada AX CL DE FB FT HN JD KF NR PA RF SD TK WA YJ KF FB SD PA WS CL HN DE AX FT JD NR RF TK YS IBD - CLASE 6
Arboles: árbol binario • Cada nodo es un registro de long. fija • Cómo se almacena ? • Archivo con reg. de long fija • La informacion en el archivo no está físicamente ordenada • Ver ejemplo del archivo para el árbol del slide anterior • Costo de espacio (muchos campos vacios) IBD - CLASE 6
Arboles: árbol binario • Insertar las claves LV NP MB KF FB SD WS PA CL HN FT AX DE JD NR RF TK YS LV NP MB IBD - CLASE 6
Arboles: árbol binario • Inserción • Sólo ligar al nodo apropiado (no reorganizar) • Para acceder al nodo MB son necesarios 7 accesos • Para árboles con cientos de claves, se requieren más de 30 accesos. IBD - CLASE 6
Arboles: árbol binario • Arbol balanceado: la altura de la trayectoria más corta hacia una hoja no difiere de la altura de la trayectoria mas grande • Inconveniente: los árboles binarios (como en el ejemplo) se desbalancean fácilmente -> búsquedas más costosas (mayor cantidad de desplazamientos) • Solución: reorganizar los nodos del árbol a medida que se reciben las claves. Resultado: Arboles AVL IBD - CLASE 6
Arboles • Tipos de árboles • Binarios • AVL • Multicamino • Balanceado (B, B*, B+) IBD - CLASE 6
Arboles AVL • Arbol binario balanceado en altura. La diferencia máx. de altura entre las alturas de cualquiera de 2 subárboles que comparten raiz común es 1 • Se llama árbol balanceado en altura ó árbol BA(1) • Las inserciones y eliminaciones se efectúan con un mínimo de accesos • Miembro de una clase más gral. de árboles balanceados en altura BA(k): máx. diferencia de altura es k IBD - CLASE 6
Arboles AVL • Garantizan un cierto nivel mínimo de desempeño de búsqueda. • La estructura debe ser respetada -> al insertar nuevos nodos, se realizan rotaciones restringidas a un área local del árbol • Como son árboles binarios, con muchos niveles son muy profundos. IBD - CLASE 6
Arboles AVL • En un árbol binario completamente balanceado, el peor caso de búsqueda para encontrar 1 clave (considerando N claves posibles) busca en log2(N+1) niveles del árbol • En un árbol AVL el peor caso de búsqueda podría ser buscar en 1.44 log2(N+2) niveles del árbol IBD - CLASE 6
Arboles AVL • Para 1.000.000 claves, un árbol completamente balanceado requiere desplazamiento en 20 niveles para buscar alguna de las claves. • En un árbol AVL el Nº máx. de niveles a buscar es 28 • Esto es bueno para almacenamiento en memoria principal • En almacenamiento secundario es deseable a lo sumo 5 o 6 desplazamientos, 20 o 28 es inaceptable. IBD - CLASE 6
Arboles • Volviendo a los 2 problemas iniciales: • La búsqueda binaria requiere demasiados desplazamientos • Mantener un índice en orden es costoso Los árboles balanceados en altura proporcionan solución aceptable al segundo problema. IBD - CLASE 6
Arboles Binarios paginados • Desplazarse en mem. secundaria tiene un costo de tiempo relativamente alto • Aunque, una vez en posición, leer o escribir un conjunto de bytes continuos es rápido • La combinación de : desplazamiento lento + transferencia rápida -> conduce a la idea de paginación IBD - CLASE 6
Arboles Binarios paginados • Al dividir un arbol binario en págs y después almacenar c/pág en bloques de localidad contiguas en disco se puede reducir el Nº de desplazamientos para cualquier búsqueda. • Paginación -> solución potencial al problema de búsqueda. IBD - CLASE 6
Arboles Binarios paginados • Estrategia: • Dividir el árbol binario en páginas • Almacenar cada página en un bloque de direcciones contiguas en disco • Ver ejemplo (posibilidad de acceder a 63 nodos con sólo 2 accesos a disco) • Dividir el árbol en páginas permite búsquedas más rápidas en almacenamiento secundario. IBD - CLASE 6
Arboles Binarios paginados • Ejemplo: • Suposición de árbol completamente balanceado • Páginas de 8 Kb -> 511 claves por pág. • Para buscar cualquiera de 134.217.727 claves se requieren sólo 3 desplazamientos. IBD - CLASE 6
Arboles Binarios paginados • Ejemplo: • Pero caso de búsqueda en un árbol binario balanceado: log2 (N+1), N: cantidad de claves • Para las versiones paginadas del mismo árbol: logk+1(N+1), N: cantidad de claves, k: cant. claves por pág. Comparación • log2 (134.217.727 +1) = 27 desplazamientos • log511+1(134.217.727 +1)= 3 desplazamientos IBD - CLASE 6
Arboles Binarios paginados • Uso de páginas grandes: • Cada acceso a una página requiere transmitir muchos datos, la mayoría no usados. • Hay tiempo de transmisión adicional, pero se ahorran muchos desplazamientos que consumen más tiempo que las retransmisiones. • Problemas: • Cómo construirlo ? • Cómo elegir la raiz ? • Cómo mantenerlo balanceado ? • La idea de agrupar claves en páginas es MB, pero no se ha encontrado forma de agrupar las claves correctamente IBD - CLASE 6
Arboles • Tipos de árboles • Binarios • AVL • Multicamino • Balanceado (B, B*, B+) IBD - CLASE 6
Arboles Multicamino • Árboles n-arios o Multicamino: • Árbol en el que cualquier nodo puede tener cualquier número de hijos • Árboles con grado 2 IBD - CLASE 6
J I H A B G C D F E ... ... ... ... ... ... ... ... ... ... Arboles Multicamino • Implementación 1 • Hijos como arreglo de referencias • Desaprovecha memoria si el número de hijos es muy variable • No puede usarse si el número de hijos es ilimitado IBD - CLASE 6
I H A B C F E D J G hijos hijos hijos hijos hijos Arboles Multicamino • Implementación 2 • Hijos como una lista enlazada hijos hijos siguiente hijos siguiente siguiente hijos siguiente hijos siguiente siguiente IBD - CLASE 6
Arboles • Tipos de árboles • Binarios • AVL • Multicamino • Balanceado (B, B*, B+) IBD - CLASE 6
Arboles B • Hasta ahora, se han construido árboles desde la raiz hacia abajo. • Problemas: • Elegir la raiz • Mantenerlo balanceado • Arboles B construirlos hacia arriba a partir de la base. La raiz emerge con la construcción. IBD - CLASE 6
Árboles B • Árboles B (balanceados) • Son árboles multicamino con una construcción especial en forma ascendente que permite mantenerlo balanceado a bajo costo. IBD - CLASE 6
Arboles B • Propiedades de un árbol B de orden M: • Orden: cant. máx. de punteros por nodo • Cant. de punteros= cant. claves + 1 • Ningún nodo tiene más de M hijos • C/nodo (menos raíz y los terminales) tienen como mínimo [M/2] hijos • La raíz tiene como mínimo 2 hijos (o sino ninguno) • Todos los nodos terminales a igual nivel • Nodos no terminales con K hijos contienen K-1 nodos. Los nodos terminales tienen: • Minimo: [M/2]–1 nodos • Máximo: M–1 nodos • Formato del nodo • Cada Ri-1 < Ri < Ri+1 IBD - CLASE 6
Arboles B • Estructura • Archivo con registros de long. Fija • Cada registro tiene una pág. o nodo En Pascal (ver ejemplo): PaginaAB=record cant_claves: integer claves: array [1..maxllaves] of char; hijos: array [1..maxhijos] of integer; end IBD - CLASE 6
Arboles B • Definición: nodo adyacente hermano • Dos nodos son adyacentes hermanos si tienen el mismo padre y son apuntados por punteros adyacentes en el padre. • Operaciones • Búsqueda • Borrado • Creación e inserción • modificación IBD - CLASE 6
Arboles B • Búsqueda de información • Comienza desde el nodo raíz • Busca la llave en el nodo • Sino la localiza se toma el puntero correspondiente entre las claves existentes • Si no es puntero nulo se toma ese nodo y se repite desde principio. Si es un puntero nulo el elemento no se encuentra en el árbol. Ver ejemplos IBD - CLASE 6
Algoritmo (iterativo) encontro := false (k llave) tomar la raíz Repeat N nro de elementos nodo Case k = llave del registro encontro := true k < llave( R1) P := Po k > llave (Rn) P := Pn otherwise P := Pi (i/ Ri-1 < k <Ri) EndCase IF P not null then leer nodo apuntado por P Until encontro or P null Algoritmo (recursivo) ordem M estruc. del registro Record contador llaves llaves (arreglo M-1 elem.) hijos (arreglo M elem.) End Function Busca (Nrr, llave, NRR_encon, Pos-enc) Si Nrr = nulo entonces devuelve (‘no encon’) sino lee nodo apuntado x NRR enpágina busca la llave en nodo; Pos:= Posición donde encuentra o debería estar la llave Si encontro llave entoncesnrr_encon := Nrr (nodo con la llave) pos_enc := pos (posicióndentro de la llave) devuelve (encontrada) sino {busco en el nivel inferior} devuelve (busca( hijo[pos], llave, nrr_encon, pos_enc)) Fin S Fin S Fin Function Arboles B IBD - CLASE 6
Arboles • Performance • Orden M, # de nodos terminales N, N+1 punteros nulos. • Accesos: • Mejor caso: 1 lectura • Pero caso: h lecturas (con h altura del árbol) • Como acotamos h Nivel # mínimo de descendientes 1 2 2 2 * [M/2] 3 2 * [M/2] * [M/2] …………………………………………………. h 2 * [M/2]h-1 IBD - CLASE 6
Arboles • Relacion entre h y # de nodos N+1 >= 2 * [M/2]h-1 h <= 1 + log[M/2] ((N+1)/2) M = 512 y N = 1000000 h <= 3.37 (4 lecturas encuentra un registro) IBD - CLASE 6
Arboles B • Inserción (creación) • Comienza con una búsqueda que llega hasta el nivel hoja • Después de encontrar lugar de inserción en el nivel hoja, el trabajo de inserción, división y promoción continúa en forma ascendente desde abajo IBD - CLASE 6
Arboles B • Inserción (creación) • Los registros se insertan en un nodo terminal • Casos posibles • El registro tiene lugar en el nodo terminal (no se produce overflow): solo se hacen reacomodamientos internos en el nodo • El registro no tiene lugar en el nodo terminal (se produce overflow): el nodo se divide y los elementos se reparten entre los nodos, hay una promoción al nivel superior, y esta puede propagarse y generar una nueva raíz. • Ver ejemplos IBD - CLASE 6
Algoritmo (iterativo) { reg.: reg a insertar fin: inserción finalizada encontro: elemento ya está P: puntero al nodo N_G: nodo sobredimensionado N : # reg } { busco la llave en el árbol } If encontro Then reportar llave repetida Else { insertar elemento } P := nil encontro := falso Repeat Si nodo no esta lleno entonces poner reg y reordenar encontro sino copiar el nodo enN_G insertar reg. en N_G reg:= centro de N_G nodo corr.:=1/2 N_G izq nodo nuevo:=1/2 N_G der If nodo raiz nuevo then generar nuevos punteros Until encontro Arboles B IBD - CLASE 6
Algoritmo (recursivo) Funcion inserta (Nrr_Actual, llave, hijo_promo, llave_promo) Si Nrr_Actual = nulo entonces llave_promo := llave hijo_promo := nulo devuelve Promocion (promueve llave original y nulo) sino leer página de Nrr_acutal en pagina buscar llave en pagina pos := posicion donde deberia estar en llave Si encuentra llave entonces devuelve (error) valordevuelto := inserta(pagina, hijo[pos], llave, nrr_P_A, llave_P_a) Si valordevuelto <> promocion entonces devuelve(valordevuelto) sino si hay espacio en pagina para llave_p_a entonces insertar(llave_p_a, nrr_p_a en pagina) promovida abajo devuelve (no promocion) sino divide( llave_p_a, nrr_p_a, pagina, llave_promo, hijo_promo, página_nueva) escribe pagina en archivo en nrr_actual escribe pagina_nuevaen hijo_promo devuelve promoción promociona Fin Si llave_promo, hijo_promo fin funcion Arboles B IBD - CLASE 6
Arboles B Procedimiento Divide (llave_i, nrr_i, pagina, llave_promo, hijo_promo, pagina_nueva ) copiar pagina + llave a un nodo que pueda contener a todas las llaves. insertar llave_i, nrr_i en los lugares correctos de la pagina crear una nueva pagina para pagina_nueva asignar a llave_promo el valor de la llave de enmedio de la pagina grande asignar a hijo_d_promo el nrr de pagina_nueva copiar las llaves y apuntadores que preceen a llave_promo en pagina idem posteriores pagina_nueva fin procedemiento IBD - CLASE 6