Estructuras Dinámicas de Datos, Listas y Colas
February 3, 2024 | Author: Anonymous | Category: N/A
Short Description
Download Estructuras Dinámicas de Datos, Listas y Colas...
Description
REPÚBLICA BOLIVARIANA DE VENEZUELA MINISTERIO DEL PODER POPULAR PARA LA DEFENSA UNIVERSIDAD NACIONAL EXPERIMENTAL POLITÉCNICA DE LA FUERZA ARMADA
ESTRUCTURAS DINÁMICAS
LISTAS Y ARBOLES
Ing Sistemas Sección D1
Abraham Román 27.864.855
INDICE
PAGINAS TEMAS INTRODUCCIÓN LISTAS Y ÁRBOLES TIPOS Y OPERACIONES CON LISTAS LISTAS CIRCULARES. LISTAS ENLAZADAS, LISTAS DOBLEMENTE ENLAZADAS. ÁRBOLES GENERALES Y SUS CARACTERÍSTICAS ÁRBOLES BINARIOS, REPRESENTACIÓN. REPRESENTACIÓN DE ÁRBOLES BINARIOS EN MEMORIA. RECORRIDO DE ÁRBOLES BINARIOS. ÁRBOLES BINARIOS DE BÚSQUEDA. ELEMENTOS Y PROPIEDADES DE UN ÁRBOL TIPOS DE ARBOLES CONCLUSION BIBLIOGRAFIA ANEXOS
3 4-5 6-8 8-11 12-13 13-15 15-16 17 18-19 19-20 20-21 21 21 22-24
INTRODUCCIÓN
El conocimiento de las diversas estructuras de datos existentes, y el conocimiento de cómo se llevan a cabo las acciones o labores que realiza la computadora o máquina para almacenarlas en la memoria principal, es indispensable para una buena ingeniería de software. La buena ingeniería de software implica conocer o prevenir las necesidades computacionales requeridas por una empresa, o individuo, para que los problemas de los mismos puedan ser resulto de manera eficiente. Normalmente los cálculos que realiza un software depende o están en funciones de un conjunto de parámetros, los cuales deben ser almacenados en la memoria de la computadora de tal forma de que el tiempo de computo de la misma sea lo más mínimo posible, logrando resultados precisos y rápidos. Las estructuras de datos nos permiten tener control sobre la forma en que los valores necesarios para un cálculo se almacenan en la memoria principal de la computadora.
Teniendo en cuenta lo anterior, en el presente material se hablará sobre la teoría fundamental que rige las estructuras de datos, en especial, las estructuras de datos dinámicas, que le permiten al programador realizar programas flexibles en el uso de recursos para determinadas situaciones.
LISTAS Y ARBOLES
Empezamos con las definiciones de dos estructuras de datos dinámicas fundamentales.
1)
Listas: Las listas, de forma simplificada, son un conjunto de datos del mismo tipo (Normalmente. Algunos lenguajes como JavaScript permiten tener datos de distintos tipos en una estructura de datos) que se encuentran ordenados u organizados y pueden variar en número, y todos los datos se encuentran organizados de forma secuencial. Podemos ver a las listas de forma intuitiva como arreglos en los que se pueden añadir datos y eliminar datos libremente según la situación lo requiera.
Se pueden identificar dos tipos de listas por la forma en que sus datos se almacenan en la memoria: Están las listas lineales o contiguas, cuyos datos se almacenan uno al lado del otro en la memoria, y están las listas enlazadas cuyos datos se pueden almacenar de forma aleatoria en la memoria de la máquina, pero se conserva el orden mediante el registro de las direcciones de los elementos en la memoria.
Representación de listas lineales
Representación de listas enlazadas
2)
Arboles: Los árboles, son otro tipo de estructura dinámica de datos, pero este se encuentra en la categoría de estructura de datos dinámicas “no lineales”, ya que los datos en su interior se pueden encontrar y a la vez no con un orden secuencial a diferencial de las listas. De forma rudimentaria podemos decir que un árbol es una “lista de listas” (Esto para tener una mejor idea de cómo son). Los árboles son estructuras de datos que se emplean especialmente para representar a un conjunto de datos que posean entre sí una especie de vínculo o relación jerárquica, como, por ejemplo: Un árbol familiar. Una definición formal de un árbol es que es un conjunto finito de uno o más nodos (Los nodos son los elementos pertenecientes al árbol).
Representación de un arbol
TIPOS Y OPERACIONES CON LISTAS
Tipos de listas:
Las listas generalmente se pueden clasificar de dos maneras en realidad, se pueden clasificar por la forma de almacenar los datos en la memoria (como se explicó en la definición dada de lista anteriormente), y se pueden clasificar según la naturaleza de sus operaciones. A continuación, se presenta dos clasificaciones existentes para las listas.
- Según la forma de almacenar los datos en la memoria:
Listas lineales o contiguas.
Listas enlazadas o encadenadas.
De las dos anteriores se derivan directamente las siguientes listas:
Listas lineales simples.
Listas lineales circulares.
Listas enlazadas simples.
Listas enlazadas circulares.
Listas doblemente enlazadas.
-
Según las operaciones que se pueden realizar
Pilas.
Colas.
Doble cola.
Operaciones con listas:
Las operaciones que son posibles realizar en las listas son muy sencillas de entender o comprender
1. Insertar, eliminar o localizar un elemento. 2. Determinar el número de elementos en la lista
3. Recorrer la lista para localizar un determinado elemento. 4. Clasificar los elementos de la lista en orden ascendente o descendente.
5. Unir dos o más listas en una sola. 6. Dividir una lista en varias sublistas.
7. Copiar la lista. 8. Borrar la lista.
Cabe destacar que dependiendo del tipo de lista en que estemos trabajando (según la clasificación de listas por operaciones), algunas de las operaciones anteriores se realizan con procedimientos o reglas determinadas. Por ejemplo: Las pilas son listas en donde la inserción de elementos y eliminación de elementos solo es posible en un solo lado de la misma, consideremos una pila de platos analógicamente, los platos solo pueden ser removidos desde la cima de la pila ya que si se hace desde la parte inferior, la pila de platos caería al suelo y se partieran todos los platos.
LISTAS ENLAZADAS, LISTAS CIRCULARES, Y LISTAS DOBLEMENTE ENLAZADAS
A continuación, nos adentraremos en la explicación de lo que son las listas enlazadas, circulares y doblemente enlazadas. Empezaremos por tratar las listas enlazadas.
-
Listas enlazadas:
En las listas simples se tiene que los datos son almacenados en la memoria principal de la computadora de forma secuencial como lo muestra ilustrativamente la siguiente imagen (Los bloques en donde se encuentran los números en la siguiente figura son representativamente los bloques de memoria principal de la computadora).
El problema que tiene esta forma de almacenar los datos es que si no hay disponibles bloques de memoria principal consecutivos para crear una lista simple, o que se quiera agregar otro elemento a la lista y no existe un bloque consecutivo
disponible para esto, se presenta lo que se conoce como “desbordamiento de pila”, que es la situación en donde ya no se dispone del espacio suficiente para almacenar los datos requeridos por una aplicación, pudiendo provocar grandes estragos al programa e incluso al propio sistema operativo.
Para solucionar este problema, los científicos computacionales optaron por implementar las listas mediante lo que se conoce como “punteros”. Las listas enlazadas funcionan exactamente igual que las listas simples, la única diferencia es la forma en la que se almacenan los datos en la memoria principal, en las listas enlazadas se logra evitar el problema de tener bloques de memoria consecutivos ya que los datos en este caso, cada uno de ellos, se almacena en cualquier bloque de memoria principal disponible, sin importar que estos bloques de memoria se encuentre consecutivos entre sí, cada uno de los elementos de la lista enlazada poseen además de su valor, un puntero que guarda la dirección de memoria del elemento que lo sucede dentro de la lista. Podemos entender todo esto con una simple pero significativa imagen.
Nota: El puntero perteneciente al último elemento de la lista enlazada, guarda la dirección NULL, ya que no lo sucede ningún elemento.
-
Listas circulares: En las listas simples, la forma de acceder a un elemento específico es recorriendo la lista hasta la posición o bloque de memoria en la que se almacena el elemento, esto tiene un inconveniente, si el programa después de obtener dicho valor necesita ahora el valor en la posición anterior tendría que recorrer toda la lista desde el principio de la misma para obtenerlo, la misma situación ocurre si el programa necesita el valor en la posición de memoria siguiente al del elemento actual accedido(en algunas ocasiones). Esta desventaja se suele solucionar con implementaciones de listas específicas, una de ellas son las listas circulares. En las listas circulares es posible acceder a cualquier elemento de la lista independientemente de que si estemos en el último elemento de la lista, o en un elemento intermedio, ya que para acceder a otro elemento no es necesario regresar al principio de la lista y tenerla que recorrer todo, sino, que simplemente a partir de la posición en donde nos encontremos en la lista, empezaremos a recorrer la lista desde dicha posición sin tener que regresarnos(básicamente estaremos recorriendo la lista en forma de anillo o circularmente). Podemos aclarar todo esto mediante una simple ilustración.
-
Listas doblemente enlazadas:
Las listas doblemente enlazadas cumplen con los mismos principios de las listas enlazadas, almacenar los datos en cualquier bloque de memoria disponible, y conservar la secuencia mediante un registro de las direcciones de memoria de los elementos que suceden a cada uno de los elementos. Sin embargo, las listas
doblemente enlazadas, en cada uno de sus elementos se asocian dos punteros en vez de uno solo, en donde un puntero se guarda la dirección de memoria del elemento que antecede al elemento actual y en el otro puntero se guarda la dirección de memoria del elemento que sucede al elemento actual, permitiéndonos recorrer la lista hacia adelante y hacia atrás independientemente de la posición en donde nos encontremos en la lista. Se puede visualizar esto mediante una simple imagen.
ARBOLES GENERALES Y CARACTERÍSTICAS
-
Arboles generales:
Un árbol general simplemente es un árbol cuyos nodos(elementos) no presenten un patrón de organización a parte de la organización jerárquica típica de los árboles. Podemos representar esto mediante la siguiente figura.
-
Características de los arboles: Todos los arboles presentan las siguientes características, sin importar que estén en la forma general o no.
Raíz: todos los arboles no vacíos tienen un único nodo(elemento) raíz. Todos los demás nodos descienden de el.
Nodo: son los elementos de un árbol.
Hoja: Es aquel nodo que no presenta o contiene (o sigue) ningún subárbol o nodo.
Los nodos de un mismo padre se llaman hermanos
Los nodos que no son hojas se llaman nodos interiores.
Una colección de uno o más árboles se denomina bosque
Todos los nodos tienen un solo padre, excepto la raíz.
Se denomina camino al enlace entre dos nodos consecutivos, y rama, al camino que termina en una hoja.
Cada nodo tiene asociado un número de nivel que se determina por la longitud del camino desde la raíz al nodo específico.
La altura o profundidad de un árbol es el número máximo de nodos de una rama. Equivale al nivel más alto de los nodos más uno.
El peso de un árbol es el número de nodos terminales.
ARBOLES BINARIOS Y REPRESENTACIÓN
-
Arboles binarios: Los arboles binarios son árboles en donde cada nodo puede tener cero, uno o dos subárboles a los cuales se les da el nombre de subárbol izquierdo y subárbol derecho. Estos árboles cumplen o poseen exactamente las mismas características presentadas de los arboles anteriormente.
-
Representación de árboles binarios: Existen dos formas de representar árboles en general, ya sean binarios o no, o implementarlos en un programa, mediante punteros y mediante arreglos, por lo general, se elige la primera forma ya que cumple con las ventajas de las listas enlazadas mencionadas anteriormente y además que la tarea de representar arboles generales mediante arreglos en algunas ocasiones es prácticamente imposible por la forma en que este está estructurado, haciendo que no podamos ingeniar ningún orden representativo dentro de un arreglo, es posible utilizar este tipo
de representación con los arboles binarios gracias a las propiedades que tienen los mismos.
Representación mediante arreglos (o vectores) de un árbol binario: Para representar a un árbol binario en un vector se escriben por niveles los nodos del árbol de manera ordenada, de izquierda a derecha (hijo izquierdo — hijo derecho). Esta representación es poco eficiente cuando el árbol no es completo, en vista del gran desperdicio de memoria que podría haber por las posiciones libres que quedarían en el vector.
Representación mediante punteros: Se usa exactamente el mismo razonamiento de las listas enlazadas, la única diferencia es que a cada nodo del árbol de le asocian tantos punteros como sean necesarios para guardar la dirección de memoria del elemento padre, y las direcciones de memorias de los elementos hijos.
REPRESENTACIÓN DE ARBOLES BINARIOS EN MEMORIA
Ya se presentaron anteriormente las dos formas en la que se pueden representar los árboles, ahora bien, pasemos a explicar un poco más como se almacenan los elementos del árbol en la memoria.
Los elementos de un árbol binario en la memoria principal de una computadora pueden almacenarse en forma secuencial o en bloques de memorias consecutivas si elegimos representarlos mediante arreglos o vectores, en este tipo de representación se tiene por lo general una fórmula que nos indica cual es el orden de descendencia de los elementos del árbol, como se puede intuir, almacenar los elementos del árbol de esta manera, trae consigo las desventajas vistas en las listas lineales de datos, esto quiere decir que también podemos llegar a la situación conocida como “desbordamiento de pila” a que efectivamente en lo que es la memoria principal de la computadora los datos están almacenados en un arreglo(o pila, analógicamente).
Si se elige representar el árbol mediante punteros, entonces los elementos estarán almacenados en cualquier bloque de memoria aleatorio disponible en la memoria principal de la computadora
RECORRIDO DE ARBOLES BINARIOS
Decimos que el recorrido de un árbol es el proceso que permite acceder una sola vez a cada uno de los nodos del árbol. Cuando un árbol se recorre, el conjunto completo de nodos se examina. Existen muchos modos para recorrer un árbol binario. Los algoritmos implementados para realizar este proceso presentan las siguientes actividades en común: Visitar el nodo raíz, recorrer el subárbol izquierdo, recorrer el subárbol derecho; Estas tres acciones repartidas en diferentes órdenes proporcionan los diferentes recorridos del árbol. Los más frecuentes tienen siempre presente en común recorrer el subárbol izquierdo y luego el derecho.
Estos algoritmos pueden dividirse de tres maneras: Los nombres de los mismos reflejan el momento en que se visita el nodo raíz
Algoritmo pre-orden: Las acciones secuenciales ejecutadas por este algoritmo son visitar la raíz, recorrer el subárbol izquierdo en preorden, recorrer el subárbol derecho en pre-orden.
Algoritmo in-orden: Las acciones son recorrer el subárbol izquierdo en in-orden, visitar la raíz, recorrer el subárbol derecho en in-orden.
Algoritmo post-orden: Las acciones son recorrer el subárbol izquierdo en post-orden, recorrer el subárbol derecho en post-orden y visitar la raíz.
ARBOLES BINARIOS DE BUSQUEDA
La definición de este tipo de árbol binario es muy sencilla de comprender. Se trata de árboles binarios en los que se cumple que, para cada nodo, el valor de la clave de la raíz del subárbol izquierdo es menor que el valor de la clave del nodo y que el valor de la clave raíz del subárbol derecho es mayor que el valor de la clave del nodo. Su principal característica radica en la forma ordenada de insertar sus elementos, facilitando así la búsqueda de un nodo en particular.
Formalmente, la definición de un árbol binario de búsqueda es la siguiente.
ELEMENTOS Y PROPIEDADES DE UN ARBOL -
-
Los elementos de los árboles son:
Raíz: todos los arboles no vacíos tienen un único nodo(elemento) raíz. Todos los demás nodos descienden de él.
Nodo: son los elementos de un árbol.
Hoja: Es aquel nodo que no presenta o contiene (o sigue) ningún subárbol o nodo.
Subárbol: Conocemos como subárbol a todo árbol generado a partir de una sección determinada del árbol, Por lo que podemos decir que un árbol es un nodo raíz con n subárboles.
Las propiedades de los árboles son:
Todos los nodos tienen un solo padre, excepto la raíz.
Cada nodo tiene asociado un número de nivel que se determina por la longitud del camino desde la raíz al nodo específico.
La altura o profundidad de un árbol: Es el número máximo de nodos de una rama. Equivale al nivel más alto de los nodos más uno.
Peso de un árbol: Es el número de nodos terminales.
TIPOS DE ARBOLES A continuación, se mencionará una lista con los principales tipos de árboles que podemos encontrarnos.
1) Arboles binarios. 2) Árbol n-ario: los arboles n-arios son aquellos arboles donde el número máximo de hijos por nodo es de N.
3) Árbol binario lleno: Es aquel que el que todo el nodo tiene cero o dos hijos con excepción de la Raíz. 4) Árbol binario perfecto: Es un Árbol lleno en donde todos las Hojas están en el mismo Nivel.
5) Árbol binario de búsqueda. 6) Árbol avl: Están siempre equilibrados de tal modo que para todos los nodos, la altura de la rama izquierda no difiere en más de una unidad de la altura de la rama derecha.
7) Árbol rojo-negro: Es un árbol binario de búsqueda en el que cada nodo tiene un atributo de color cuyo valor es o bien rojo o bien negro. 8) Árbol aa: A son una variación del árbol rojo-negro, que a su vez es una mejora del árbol binario de búsqueda. A diferencia de los árboles rojonegro, los nodos rojos en un árbol AA sólo pueden añadirse como un hijo derecho.
CONCLUSIÓN
El conocimiento teórico sobre las dos estructuras de datos dinámicas presentadas en este material, tuvo el objetivo de dar una introducción intuitiva, general y precisa sobre lo que son y cómo se almacenan en memoria las listas y los árboles, preparando el terreno para un estudio futuro sobre su implementación en los lenguajes de programación existentes y así poder resolver mediante estas estructuras los problemas que requieran almacenar datos en la memoria principal con un orden jerárquico indispensable para la correcta y eficiente solución de los problemas que se puedan presentar en un futuro.
BIBLIOGRAFÍA
Fundamentos de programación – Luis Joyanes Aguilar – segunda edición
https://garciagregorio.webcindario.com/ed/arboles_clasificacion.pdf
https://decsai.ugr.es/~jfv/ed1/c++/cdrom4/paginaWeb/abb.htm
https://www.oscarblancarteblog.com/2014/08/22/estructuradedatosarb oles/#:~:text=Nodos%3A%20Se%20le%20llama%20Nodo,nodos%20 que%20tiene%20un%20padre.
ANEXOS
Estructura de datos tipo lista
Comparación estructura de datos tipo árbol y lista lineal
Memoria principal de una computadora
View more...
Comments