Universidad de Oriente Núcleo de Monagas Escuela de Ingeniería y Ciencias Aplicadas Departamento de Sistemas Estructura De Datos Sección 01
ÁRBOLES
Profesora:
Bachilleres:
Alba Ortiz
Gamardo, Dubraska C.I: 22.725.662 Habib, Brian C.I: 25.273.720 González, Ricardo C.I: 23.539.677 Millan, Brunett C.I.:24.512.052 Ortiz, Andrea C.I: 18.462.519
Maturín, Julio del 2017.
1. Árboles En ciencias de la computación, un árbol es una estructura de datos ampliamente usada que emula la forma de un árbol (un conjunto de nodos conectados). Un nodo es la unidad sobre la que se construye el árbol y puede tener cero o más nodos hijos conectados a él. Se dice que un nodo a es padre de un nodo b, si existe un enlace desde a hasta b (en ese caso, también decimos queb es hijo de a). Sólo puede haber un único nodo sin padres, que llamaremos raíz. Un nodo que no tiene hijos se conoce como hoja. El árbol También se define como una estructura de datos no lineal. Esta estructura se usa principalmente para representar datos con una relación jerárquica entre sus elementos, como por ejemplo registros, árboles genealógicos y tablas de contenidos. Entre otros tenemos un tipo especial de árbol que es, llamado árbol binario, que puede ser implementado fácilmente en la computadora. La definición de un árbol implica una estructura recursiva. Esto es, la definición del árbol se refiere a otros árboles. Un árbol con ningún nodo es un árbol nulo; no tiene raíz.
2. Aplicaciones de Árboles De las estructuras de datos de tipo Árbol, la especie más utilizada es el Árbol Binario de Búsqueda. Los principales tipos de árboles binarios de búsqueda son los AVL, B* y balanceado. Los árboles binarios de búsqueda se utilizan para localizar en forma rápida un elemento almacenado en ese árbol, a partir de una clave. Son una forma de implementar arreglos asociativos o mapas, en donde se almacenan elementos que son pares. En las bases de datos relacionales, para poder localizar en forma rápida un registro de una taba a partir de una clave, se utilizan objetos asociados a las tablas llamados índices. Estos índices son árboles binarios de búsqueda almacenados en el disco, que a partir de una clave indican dónde se encuentra el registro correspondiente en la tabla. Otro ejemplo de la utilización de árboles binarios de búsqueda son los diccionarios. A partir de una palabra, se realiza una búsqueda en el árbol para saber si está incluida en el conjunto, y si existe, se obtienen sus datos asociados (por ejemplo, si es un verbo, un sustantivo, un artículo, etc.). En Teoría de Compiladores,
durante la fase de análisis del código fuente, los analizadores léxico, sintáctico y semántico utilizan tablas de símbolos, en donde se almacenan las palabras clave y las palabras reservadas y sus atributos, implementadas (por lo general) como árboles binarios de búsqueda. En síntesis, se utiliza un árbol binario de búsqueda cuando se desea almacenar en una estructura de datos cierta información, a la cual luego se desea acceder en forma rápida a partir de una clave. La representación gráfica de un árbol binario es la siguiente: Representación en Memoria Hay dos formas tradicionales de representar un árbol binario en memoria: * Por medio de datos tipo punteros también conocidos como variables dinámicas o listas. * Por medio de arreglos. Sin embargo la más utilizada es la primera, puesto que es la más natural para tratar este tipo de estructuras. Los nodos del árbol binario serán representados como registros que contendrán como mínimo tres campos. En un campo se almacenará la información del nodo. Los dos restantes se utilizarán para apuntar al subárbol izquierdo y derecho del subárbol en cuestión. Cada nodo se representa gráficamente de la siguiente manera: Clasificación de Arboles Binarios Existen cuatro tipos de árbol binario: * A. B. Distinto. * A. B. Similares. * A. B. Equivalentes. * A. B. Completos. A continuación se hará una breve descripción de los diferentes tipos de árbol binario así como un ejemplo de cada uno de ellos. A. B. DISTINTO Se dice que dos árboles binarios son distintos cuando sus estructuras son diferentes. Ejemplo: A. B. SIMILARES Dos árboles binarios son similares cuando sus estructuras son idénticas, pero la información que contienen sus nodos es diferente. Ejemplo: A. B. EQUIVALENTES Son aquellos árboles que son similares y que además los nodos contienen la misma información.
Ejemplo: A. B. COMPLETOS Son aquellos árboles en los que todos sus nodos excepto los del último nivel, tiene dos hijos; el subárbol izquierdo y el subárbol derecho. Recorridos. El recorrido en un árbol binario permite rescatar los datos en formas diferentes. Aunque existen varias maneras de hacerlo, aquí se verán las más conocidas: inorden, preorden, postorden. Una de los recorridos más usados (inorden) es el que rescata los datos en forma ordenada (de menor a mayor). La técnica que usualmente se usa para hacer el recorrido, es ir almacenando los
datos en una estructura lineal: Cola, Lista o Pila. El criterio para escoger una de las tres depende del problema, pero generalmente los criterios generales son los siguientes: Cola: los datos quieren ser vistos en el mismo orden en el cual fueron recorridos y la cola pasa a ser un instrumento de almacenamiento de "corto plazo" : (almacenar , ver , vaciar ). Lista: los datos necesitan ser almacenados y se requieren operaciones en donde es necesario acceder a los datos en cualquier posición. Pila: se necesita que los datos se almacenen en forma de pila, pasando a ser un instrumento de almacenamiento de "corto plazo". De aquí en adelante, las implementaciones de recorrido serán usando una Cola, ya que los problemas que vienen, requieren los datos en forma ordenada. o
Recorrido En Arbol Binario En Preorden
El recorrido en un árbol binario permite rescatar los datos en formas diferentes. Aunque existen varias maneras de hacerlo, aquí se verán las más conocidas: inorden , preorden , postorden. Una de los recorridos más usados ( inorden) es el que rescata los datos en forma ordenada (de menor a mayor). La técnica que usualmente se usa para hacer el recorrido, es ir almacenando los datos en una estructura lineal: Cola , Lista o Pila. El criterio para escoger una de las tres depende del problema, pero generalmente los criterios generales son los siguientes :
Cola : los datos quieren ser vistos en el mismo orden en el cual fueron recorridos y la cola pasa a ser un instrumento de almacenamiento de "corto plazo" : (almacenar , ver , vaciar ). Lista : los datos necesitan ser almacenados y se requieren operaciones en donde es necesario acceder a los datos en cualquier posición. Pila : se necesita que los datos se almacenen en forma de pila, pasando a ser un instrumento de almacenamiento de "corto plazo". De aquí en adelante, las implementaciones de recorrido serán usando una Cola , ya que los problemas que vienen, requieren los datos en forma ordenada.
o
Recorrido En Árbol Binario Inorden
Se declara una función que recibe como parámetros un arbol binario y una cola.
Las instrucciones de la función, siguen el concepto recursivo de la definición, teniendo en cuenta que el concepto de "visitar el elemento de la raiz" se reemplaza por : obtener la raíz e insertar el elemento en la cola y que la condición de la recursividad es que se encuentre con algún subárbol vacío. *nota : Hay que tener cuidado en verificar que la cola que se pasa como parámetro sea no vacía. Las funciones serán implementadas en el archivo "funcArbin.h". void inordenArbin(Arbin a,Cola col) { if (!vacioArbin(a)) { inordenArbin(izqArbin(a),col); TipoA raiz = raizArbin(a); adicCola(col,raiz); inordenArbin(derArbin(a),col); } } o Recorrido En Árbol Binario Posorden
Recorrer el subarbol izquierdo en postorden. Recorrer el subarbol derecho en postorden. Examinar la raíz.
3. Representación de los Árboles Diagramas de Venn
También conocido como diagrama de conjuntos. Un diagrama de Venn es un diagrama que muestra visualmente todas las posibles relaciones lógicas entre una colección de conjuntos, cada uno se representaba generalmente como un círculo. Cada elemento principal acoge una colección de objetos o conjunto de datos que tienen algo en común. Cuando varios círculos (conjuntos) se solapan se forma lo que se conoce como una “intersección”,
en ella se muestran los elementos o datos que tienen características en común. Los diagramas de Venn pueden estar formados por varios conjuntos.
Anidación de Paréntesis
El anidamiento en parentesis está relacionado a la inclusión de estructuras de control dentro de otras, usualmente indicado mediante la inclusión de distintos niveles de sangría (llamada indentation en inglés) dentro del código fuente.
Notación Decimal de Dewey
Es un sistema de clasificación de estructura jerárquica está compuesto por categorías y subcategorías que se organizan en forma de árbol, formándose divisiones y subdivisiones que dependen unas de otras. Notación Decimal Dewey a la hora de elaborar su sistema de clasificación se baso en los números arábigos, ya que éstos, a diferencia de las letras, son universales. Esta clasificación se basa en un método de organización jerárquica. Todas las materias debían contener al menos tres números,de tal manera que si una materia principal contiene un número básico de sólo una o dos cifras, se le debe añadir un cero o dos para completarlo. Si necesitamos más de tres cifras lo indicaríamos con un punto.
Notas La Clasificación Decimal de Dewey contiene cuatro categorías principales de notas:
Notas referentes al contenido de la clase: Indican el contenido o qué sinónimos pertenecen a esa clase
Notas referentes al emplazamiento de una materia: Presentan una ayuda a los clasificadores a la hora de subdividir una materia Notas referentes al contenido de otra sección: Hacen una comparación con otras materias que estén relacionadas Notas referentes a los cambios en el sistema: Indicando el número que se hace para la nueva materia.
Notación Indentada
La Indentación es un anglicismo (de la palabra inglesa indentation) de uso común en informática; no es un término reconocido por la Real Academia Española (consultado en la vigesimosegunda edición). La Real Academia recomienda utilizar «sangrado». Este término significa mover un bloque de texto hacia la derecha insertando espacios o tabuladores, para así separarlo del margen izquierdo y mejor distinguirlo del texto adyacente; en el ámbito de la imprenta, este concepto siempre se ha denominado sangrado o sangría. En los lenguajes de programación de computadoras, la indentación es un tipo de notación secundaria utilizado para mejorar la legibilidad del código fuente por parte de los programadores, teniendo en cuenta que los compiladores o intérpretes raramente consideran los espacios en blanco entre las sentencias de un programa. Sin embargo, en ciertos lenguajes de programación como Haskell, Occam y Python, el sangrado se utiliza para delimitar la estructura del programa permitiendo establecer bloques de código. Son frecuentes discusiones entre programadores sobre cómo o dónde usar el sangrado, si es mejor usar espacios en blanco o tabuladores, ya que cada programador tiene su propio estilo.
Grafo
Un grafo dirigido G consiste en un conjunto de vértices V y un conjunto de arcos o aristas A. Los vertice se denominan también nodos o puntos. Un arco, es un par ordenado de vértices(V,W) donde V es el vértice inicial y W es el vértice terminal del arco. Un arco se expresa como: V – >W Los vértices de un grafo pueden usarse para representar objetos. Los arcos se utilizan para representar relaciones entre estos objetos.
Las aplicaciones más importantes de los grafos son las siguientes:
o
Rutas entre ciudades. Determinar tiempos máximos y mínimos en un proceso. Flujo y control en un programa. Operaciones Sobre Grafos:
En esta sección analizaremos algunas de las operaciones sobre grafos, como :
Creación. Inserción. Búsqueda. Eliminación.
En esta sección, continuaremos utilizando los apuntadores que se usaron en las secciones anteriores. TOP para hacer referencia al primer nodo, LD para indicar liga derecha y LA para indicar liga abajo, por último usaremos los apuntadores P y Q para hacer referencia a los nuevos nodos que vayan a ser usados.
o
Representación De Grafos En Memoria
Los grafos se representan en memoria enlazada mediante listas de adyacencia. Una lista de adyacencia, se define de la siguiente manera: Para un vértice i es una lista en cierto orden formada por todos los vértices adyacentes [a,i]. Se puede representar un grafo por medio de un arreglo donde cabeza de i es un apuntador a la lista de adyacencia al vértice i.
4. Características y Propiedades de los Árboles La estructura tipo árbol tiene ciertas características y propiedades que la distinguen. A continuación se presentan las más importantes: Todo árbol que no es vacio tiene un único nodo raíz. Un nodo X es descendiente directo de un nodo Y, si el nodo X es apuntado por el nodo Y. En este caso es común utilizar la expresión Xes hijo de Y.
Un nodo X es antecesor directo de un nodo Y, si el nodo X apunta al nodo Y. En este caso es común utilizar la expresión X es padre deY. Se dice que todos los nodos que son descendientes directos — hijos — de un mismo nodo — padre — son hermanos. Todo nodo que no tiene ramificaciones — hijos — , se conoce con el nombre de terminal u hoja. Todo nodo que no es raíz ni terminal u hoja se conoce con el nombre de interior. Grado es el número de descendientes directos de un determinado nodo. Grado del árbol es el máximo grado de todos los nodos del árbol. Nivel es el número de arcos que deben ser recorridos para llegar a un determinado nodo. Por definición la raíz tiene nivel 1. Altura del árbol es el máximo número de niveles de todos los nodos del árbol.
5. Longitud de Camino Interno Y Externo Longitud de Camino Interno La longitud de camino interno es la suma de las longitudes de camino de todos los nodos del árbol. Puede calcularse por medio de las siguientes formula:
donde i representa el nivel del árbol, h su altura y ni el numero de nodos en el nivel i. La LCI del árbol de la figura 1.22 se calcula así: LCI = 1 * 1 + 2 * 2 + 5 * 3 + 4 * 4 = 36 Ahora bien, la media de la longitud de camino interno (LCIM) se calcula dividiendo la LCI entre el numero de nodos del árbol (n). Se expresa:
y significa el numero de arcos que deben ser recorridos en un promedio para llegar, partiendo desde la raiz, a un nodo cualquiera del árbol. La LCIM del árbol de la figura 1.22 se calcula mediante:
LCIM= 36/12=3 Longitud de Camino Externo Para definir la longitud de camino externo es necesario primero definir los conceptos árbol extendido y nodo especial. Un árbol extendido es aquel en el que el número de hijos de cada nodo es igual al grado del árbol. Si alguno de los nodos del árbol no cumple con esta condición entonces debe incorporársele al mismo nodo especial; tanto como sea necesario satisfacer la condición. Los nodos especiales tienen como objetivo remplazar las ramas vacías o nulas, no pueden tener descendientes y normalmente se representan con la forma de un cuadrado. En la figura 1.23 se presenta el árbol extendido de la figura 1.22.
El número de nodos especiales de este nodo es de 25. se puede definir ahora la longitud de camino externo como la suma de las longitudes de caminos externo como la suma de las longitudes de caminos de todos los nodos especiales del árbol. Se calcula por medio de la siguiente formula:
donde i representa el nivel del árbol ,h su altura y n el numero de nodos especiales en el nivel i. Obsérvese que i comienza desde 2, puesto que la raiz se encuentra en el nivel 1 y no puede ser nodo especial. La LCE del árbol de la figura 1.23 se calcula de la siguiente manera: LCE = 1 * 2 + 1 * 3 + 11 * 4 + 12 * 5 = 109 Ahora bien la media de la longitud d camino externo (LCEM)se calcula dividiendo LCE entre el numero de nodos especiales del árbol (ne). Se expresa:
y significa el numero de arcos que debe ser recorridos en promedio para llegar partiendo de la raiz, a un nodo especial cualquiera del árbol. LCEM=109/25=4.36