Arboles
-
Upload
luis-fernando-aguas-bucheli -
Category
Business
-
view
1.724 -
download
0
Transcript of Arboles
ESTRUCTURAS DE DATOS II
CAPITULO 8
ÁRBOLES
2012 Octu
bre
LUIS F. AGUAS B. 1
CAPITULO 8
1. Árboles en general Definiciones Terminología
2. Recorrido de árboles Postorden Preorden
3. Tipos de árboles Binarios AVL Multicamino Balanceado (B, B*, B+)
2012 Octu
bre
LUIS F. AGUAS B. 2
ÁRBOL: DEFINICIÓN
En computación, un árbol es un modelo abstracto de una estructura jerárquica.
Aplicaciones:OrganigramasSistemas de archivosAmbientes de programación
2012 Octu
bre
LUIS F. AGUAS B. 3
Computadores
ventas ReclamoManufactura
Laptops DesktopsLocal Internacional
Europa Asia Canada
ÁRBOLES EN GENERAL Y CON RAÍZ
En teoría de grafos, un árbol (tree) es un conjunto de nodos (vértices) y arcos (links, lines) conectando los nodos tal que: No existen ciclos cada dos nodos están conectados por un solo arco
En muchas aplicaciones informáticas, un nodo particular del el árbol es designado raíz (root), los otros nodos son arreglados por niveles a partir del nodo raíz.
2012 Octu
bre
LUIS F. AGUAS B. 4
Árbol general Un árbol con raíz
Nivel 0
Nivel 1
Nivel 2
root
TERMINOLOGÍA DE ÁRBOLES
Una estructura de árbol es una colección de nodos, c/u con:
Puede tener uno o mas sucesores Tiene solo un predecesor, con excepción del nodo raíz.
El nodo primero o inicial de la estructura árbol es llamado raíz
Un nodo predecesor es llamado padre (parent) Un nodo sucesor es llamado hijo (children) Nodos con padre común son llamados hermanos (siblings) Un nodo sin hijos es llamado hoja (leaf) Un nodo que tiene hijos es llamado nodo interior Un nodo sin hijos es llamado nodo exterior Los nodos descendientes consisten en hijos, nietos hasta
llegar a las hojas. Los nodos ancestros consisten de padres, abuelos hasta
llegar a la raíz.
2012 Octu
bre
LUIS F. AGUAS B. 5
TERMINOLOGÍA DE ÁRBOLES
Un lado (edge or branch) es la línea que conecta un padre con el hijo.
Un camino (path) es la secuencia de lados que conectan un nodo con uno de sus descendientes
La longitud del camino (path length) es el número de lados en el camino.
La profundidad o nivel (depth o level) de un nodo es igual a la longitud de nodo a la raíz.
La profundidad de la raíz es cero El peso (height) de un árbol es igual a la longitud
del camino más largo. Un sub-árbol (subtree) es un árbol formado al
considerar un nodo como “raíz”. El nuevo árbol consiste de este nodo y su descendencia.
2012 Octubre LUIS F. AGUAS B. 6
PROPIEDAD VALOR
Numero de nodos 10
Peso 3
Nodo raíz H
Hojas A C J L M N
Nodos interiores H B F E
Nodos a nivel 2 A C J E
2012 Octubre LUIS F. AGUAS B. 7
Terminología de árboles
H
B F
A C J E
NL M
NODO DE ÁRBOL
La clase TreeNodeRepresenta un node de un árbolEs similar al Nodo de lista doble (left y right)
2012 Octu
bre
LUIS F. AGUAS B. 8
public class TreeNode{ private Object value; private TreeNode left; private TreeNode right; ...
Referencia al hijo izquierdo
Referencia al hijo derecho
LA CLASE TREENODE 2
2012 Octu
bre
LUIS F. AGUAS B. 9
... ... ... // Constructores:
public TreeNode (Object v) { value = v; left = null; right = null; }
public TreeNode (Object v, TreeNode lt, TreeNode rt) { value = v; left = lt; right = rt; }
// Métodos:
public Object getValue () { return value; } public TreeNode getLeft () { return left; } public TreeNode getRight () { return right; } public void setValue (Object v) { value = v; } public void setLeft (TreeNode lt) { left = lt; } public void setRight (TreeNode rt) { right = rt; }}
TREENODE EJEMPLO 1
2012 Octu
bre
LUIS F. AGUAS B. 10
public int countNodes (TreeNode root){ if (root == null) return 0; else return 1 + countNodes ( root.getLeft ( ) ) + countNodes ( root.getRight ( ) );}
Para root
Caso base
ÁRBOLES Y RECURSIÓN
La estructura árbol es recursiva por naturaleza, los lados derechos e izquierdo son árboles también.
2012 Octu
bre
LUIS F. AGUAS B. 11
public void traverse (TreeNode root) { if (root != null) { visit (root); for (... <each child of the root> ) traverse (< that child’s subtree>); } }
RECORRIDO PREORDEN
Preorden: primero visita la raíz, entonces atraviesa la izquierda, y luego atraviesa el subarbol derecho
2012 Octu
bre
LUIS F. AGUAS B. 12
private void traversePreorder (TreeNode root){ if (root != null) { visit (root.getValue());
traversePreorder (root.getLeft());
traversePreorder (root.getRight()); }}
A/ \
B C / \ D E
A B D E C
RECORRIDO POSORDEN
Posorden: primero atraviesa la izquierda entonces atraviesa el subarbol izquierdo, entonces visita la raíz.
2012 Octu
bre
LUIS F. AGUAS B. 13
private void traversePostorder (TreeNode root){ if (root != null) { traversePostorder (root.getLeft());
traversePostorder (root.getRight());
process (root.getValue()); }}
A/ \
B C / \ D E
D E B C A
RECORRIDO INORDEN
Inorden: primero atraviesa el subarbol izquierdo, entonces visita la raíz, entonces atraviesa el subarbol derecho
2012 Octu
bre
LUIS F. AGUAS B. 14
private void traverseInorder (TreeNode root){ if (root != null) { traverseInorder (root.getLeft());
process (root.getValue());
traverseInorder (root.getRight()); }}
A/ \
B C / \ D E
D B E A C
ÁRBOL CON ESTRUCTURAS NODO
2012 Octu
bre
LUIS F. AGUAS B. 15
B
A D
C
2012 Octu
bre
LUIS F. AGUAS B. 16
1 // Fig. 20.17: Tree.java2 // Declaration of class TreeNode and class Tree.3 package com.deitel.jhtp5.ch20;4 5 // class TreeNode declaration6 class TreeNode {7 8 // package access members9 TreeNode leftNode; 10 int data; 11 TreeNode rightNode; 12 13 // initialize data and make this a leaf node14 public TreeNode( int nodeData )15 { 16 data = nodeData; 17 leftNode = rightNode = null; // node has no children18 }19 20 // locate insertion point and insert new node; ignore duplicate values21 public synchronized void insert( int insertValue )22 {23 // insert in left subtree24 if ( insertValue < data ) {25 26 // insert new TreeNode27 if ( leftNode == null )28 leftNode = new TreeNode( insertValue );29
Nodo izquierdo y derecho
Si no se puede ingresar ir a derecho
2012 Octu
bre
LUIS F. AGUAS B. 17
30 else // continue traversing left subtree31 leftNode.insert( insertValue ); 32 }33 34 // insert in right subtree35 else if ( insertValue > data ) {36 37 // insert new TreeNode38 if ( rightNode == null )39 rightNode = new TreeNode( insertValue );40 41 else // continue traversing right subtree42 rightNode.insert( insertValue ); 43 }44 45 } // end method insert46 47 } // end class TreeNode48 49 // class Tree declaration50 public class Tree {51 private TreeNode root;52 53 // construct an empty Tree of integers54 public Tree() 55 { 56 root = null; 57 }58 59 // insert a new node in the binary search tree60 public synchronized void insertNode( int insertValue )61 {
Si el valor es mayor enotnces inserte al lado
derecho
2012 Octu
bre
LUIS F. AGUAS B. 18
62 if ( root == null )63 root = new TreeNode( insertValue ); // create the root node here64 65 else66 root.insert( insertValue ); // call the insert method67 }68 69 // begin preorder traversal70 public synchronized void preorderTraversal()71 { 72 preorderHelper( root ); 73 }74 75 // recursive method to perform preorder traversal76 private void preorderHelper( TreeNode node )77 {78 if ( node == null )79 return;80 81 System.out.print( node.data + " " ); // output node data82 preorderHelper( node.leftNode ); // traverse left subtree 83 preorderHelper( node.rightNode ); // traverse right subtree84 }85 86 // begin inorder traversal87 public synchronized void inorderTraversal()88 { 89 inorderHelper( root ); 90 }91
Recorrido en preorden
2012 Octu
bre
LUIS F. AGUAS B. 19
92 // recursive method to perform inorder traversal93 private void inorderHelper( TreeNode node )94 {95 if ( node == null )96 return;97 98 inorderHelper( node.leftNode ); // traverse left subtree99 System.out.print( node.data + " " ); // output node data100 inorderHelper( node.rightNode ); // traverse right subtree101 }102 103 // begin postorder traversal104 public synchronized void postorderTraversal()105 { 106 postorderHelper( root ); 107 }108 109 // recursive method to perform postorder traversal110 private void postorderHelper( TreeNode node )111 {112 if ( node == null )113 return;114 115 postorderHelper( node.leftNode ); // traverse left subtree 116 postorderHelper( node.rightNode ); // traverse right subtree117 System.out.print( node.data + " " ); // output node data118 }119 120 } // end class Tree
Recorrido inorden
Recorrido postorden
2012 Octu
bre
LUIS F. AGUAS B. 20
1 // Fig. 20.18: TreeTest.java2 // This program tests class Tree.3 import com.deitel.jhtp5.ch20.Tree;4 5 public class TreeTest {6 7 public static void main( String args[] )8 {9 Tree tree = new Tree();10 int value;11 12 System.out.println( "Inserting the following values: " );13 14 // insert 10 random integers from 0-99 in tree 15 for ( int i = 1; i <= 10; i++ ) {16 value = ( int ) ( Math.random() * 100 );17 System.out.print( value + " " );18 tree.insertNode( value );19 }20 21 System.out.println ( "\n\nPreorder traversal" );22 tree.preorderTraversal(); // perform preorder traversal of tree23 24 System.out.println ( "\n\nInorder traversal" );25 tree.inorderTraversal(); // perform inorder traversal of tree
Insertar 10 enteros en árbol
Recorrido preorden
Recorrido inorden
ÁRBOL IMPLEMENTACIÓN
2012 Octu
bre
LUIS F. AGUAS B. 21
26 27 System.out.println ( "\n\nPostorder traversal" );28 tree.postorderTraversal(); // perform postorder traversal of tree29 System.out.println();30 }31 32 } // end class TreeTest
Inserting the following values: 39 69 94 47 50 72 55 41 97 73 Preorder traversal39 69 47 41 50 55 94 72 73 97 Inorder traversal39 41 47 50 55 69 72 73 94 97 Postorder traversal41 55 50 47 73 72 97 94 69 39
Recorrido postorden
ÁRBOLES BINARIOS
Árboles binariosEstructuras de datos donde cada nodo tiene dos sucesores, a izquierda y a derecha.
Ejemplo Creación Inserción Borrado
Árbol balanceado: un árbol está balanceado cuando la altura de la trayectoria más corta hacia una hoja no difiere de la altura de la trayectoria más grande.
Inconveniente de los binarios: se desbalancean fácilmente.
2012 Octu
bre
LUIS F. AGUAS B. 22
ÁRBOLES AVL
Árboles AVLÁrbol binario balanceado en altura (BA(1)) en el que las inserciones y eliminaciones se efectúan con un mínimo de accesos.
Árbol balanceado en altura: Para cada nodo existe un límite en la diferencia que se
permite entre las alturas de cualquiera de los subárboles del nodo (BA(k)), donde k es el nivel de balance)
Ejemplos:
2012 Octu
bre
LUIS F. AGUAS B. 23
Características Estructura que debe ser
respetada Mantener árbol, rotaciones
restringidas a un área local del árbol Binario: profundos. Búsqueda:
Log2(N+1)
AVL: diferencia de 1. Búsqueda: 1.44 log2(N+2)
(búsqueda en el peor caso)
Árboles binarios paginados
Problemas de almacenamiento secundario, buffering, páginas de memoria, varios registros individuales, minimiza el número de accesos
Problema: construcción descendente, como se elige la raíz?, cómo va construyendo balanceado?
2012 Octu
bre
LUIS F. AGUAS B. 24
ÁRBOLES CARACTERÍSTICAS
ÁRBOLES MULTICAMINO Y B
Árboles multicaminoGeneralización de árboles binarios, c/nodo tiene k punteros y k-1 claves (o registros), disminuye la profundidad del árbol, Orden del árbol.
Árboles B (balanceados)Son árboles multicamino con una construcción especial en forma ascendente que permite mantenerlo balanceado a bajo costo.
2012 Octu
bre
LUIS F. AGUAS B. 25
ÁRBOLES B PROPIEDADES
Propiedades de un árbol B de orden M: 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 registros.
Los nodos terminales tienen: Mínimo [M/2] –1 registros Máximo M – 1 registros
Formato del nodo
2012 Octu
bre
LUIS F. AGUAS B. 26
PO R1 P1 R2 P2 R3 P3 R4 P4 R5 P5 Nro de registros
ÁRBOLES OPERACIONES
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
2012 Octu
bre
LUIS F. AGUAS B. 27
ÁRBOLES: BÚSQUEDA
Búsqueda de información Comienza desde el nodo raíz
Busca la llave en el nodo Si no la localiza se toma el puntero anterior a la llave mayor Si no es puntero nulo se toma ese nodi y se repite del
principio. Si es un puntero nulo el elemento no se encuentra en el árbol.
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)
2012 Octu
bre
LUIS F. AGUAS B. 28
ÁRBOLES: # LECTURAS
Como acotamos hNivel # mínimo de descendientes 1 2 2 2 * [M/2] 3 2 * [M/2] * [M/2]…………………………………………………. h 2 * [M/2]h-1
Relación 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)
2012 Octu
bre
LUIS F. AGUAS B. 29
Algoritmo (iterativo)encontro := false (k llave)tomar la raízRepeat 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 PUntil encontro or P null
Algoritmo (recursivo)orden M estruc. del registro Record contador llaves llaves (arreglo M-1 elem.) hijos (arreglo M elem.) EndFunction Busca (Nrr, llave,NRR_encon, Pos_enc) Si Nrr = nulo entonces devuelve (‘no encon’) sino lee nodo apuntado x NRR en página busca la llave en nodo; Pos:= Posición donde encuentra o debería estarla llave Si encontro llave entonces nrr_encon := Nrr (nodo con la
llave) pos_enc := pos (posición dentro de llave) devuelve (encontrada) sino {busco en el nivel inferior}
devuelve (busca( hijo[pos],llave, nrr_encon, pos_enc)) Fin S Fin SFin Function
2012 Octu
bre
LUIS F. AGUAS B. 30
ARBOLES ALGORITMOS
ÁRBOLES: INSERCIÓN
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.
2012 Octu
bre
LUIS F. AGUAS B. 31
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 Informar llave repetida Else { insertar elemento } P := nil encontro := falso
Repeat IF nodo no esta lleno Then poner reg y reordenar encontro Else copiar el nodo en N_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
2012 Octu
bre
LUIS F. AGUAS B. 32
ÁRBOLES: INSERCIÓN
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_nueva en hijo_promo devuelve promoción promociona Fin Si llave_promo, hijo_promofin funcion
2012 Octu
bre
LUIS F. AGUAS B. 33
ÁRBOLES: INSERCIÓN
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_nuevafin procedimiento
Performance Mejor caso (sin overflow)
H lecturas 1 escritura
Peor caso (overflow hasta la raíz, aumenta en uno el nivel del árbol) H lecturas 2h+1 escrituras (dos por
nivel más la raíz) Estudios realizados
M = 10 25% divisiones M = 100 2% divisiones
2012 Octu
bre
LUIS F. AGUAS B. 34
DIRECTORIO
ÁRBOLES: ELIMINACIÓN
EliminaciónMejor caso: borra un elemento del nodo y no produce underflow, solo reacomodos ( # elementos >= [M/2]-1
Peor caso: se produce underflow, #elementos < [M/2] – 1
Eliminar Nodo Terminal Nodo no Terminal ( llevar a un nodo Terminal)
Dos soluciones Redistribuir concatenar
2012 Octu
bre
LUIS F. AGUAS B. 35
ÁRBOLES: REDISTRIBUIR
Redistribuir Cuando un nodo tiene underflow puede trasladarse llaves de un nodo
adyacente hermano (en caso que este tenga suficientes elementos) Concatenación:
Si un nodo adyacente hermano está al mínimo (no le sobra ningún elemento) no se puede redistribuir, se concatena con un nodo adyacente disminuyendo el # de nodos (y en algunos casos la altura del árbol)
2012 Octu
bre
LUIS F. AGUAS B. 36
ÁRBOLES: PERFORMANCE
Performance Mejor caso (borra de un nodo Terminal)
H lecturas 1 escritura
Peor caso (concatenación lleva a decrementar el nivel del árbol en 1) 2h – 1 lecturas H + 1 escrituras
2012 Octu
bre
LUIS F. AGUAS B. 37
Algoritmo de eliminación (iterativo){ fin: indica fin del borrado n_g:nodo tamaño mayor al normal ady: nodo adyacente hermano reg: reg. a borrar}{buscar reg en el árbol }If reg no está en un nodo terminal then buscar el sucesor de reg en un nodo terminal intercalar reg con su sucesor { eliminación de reg } fin := falsorepeat remover reg y el puntero asociado If nodo corriente > [M/2] -1 elem. then fin := true else if es posible redistribuir then {redistribuir}{ady.>min.}
copiar ady y nodo actual en n_g dividir n_g promover nueva llave a padre armar nodo actual y ady con la
mitad de n_g en c/u fin := true else {concatenar} elegir el mejor ady para concat. poner ady y nodo actual juntos y acoplarle elemnto nodo padre eliminar nodo que sobra y producir enganches nuevo reg elemento que bajo nodo padra y que debemos eliminarUntil finIF no hay registro en la raiz then nueva raiz nodo corriente liberar vieja raíz
2012 Octu
bre
LUIS F. AGUAS B. 38
ÁRBOLES: ELIMINACIÓN
CAPITULO 8
PREGUNTAS Y RESPUESTAS
2012 Octu
bre
LUIS F. AGUAS B. 39