Este documento describe estructuras de datos dinámicas como pilas, colas, listas y árboles. Explica que las estructuras dinámicas cambian a lo largo del tiempo a diferencia de las estáticas. Define pilas como estructuras donde los elementos se agregan y eliminan solo por un extremo siguiendo el principio LIFO. Define colas como estructuras donde los elementos se agregan por un extremo y eliminan por el otro siguiendo el principio FIFO. Finalmente describe listas enlazadas y diferentes tipos como listas ordenadas y doblemente en
Esta presentación es parte del contenido del curso de Estructuras de Datos I impartido en la Universidad Rafael Landívar durante el año 2017.
Creado por Ing. Alvaro Enrique Ruano
Instituto Tecnológico Superior de Guasave
Ingeniería en Sistemas Computacionales
Estructura de Datos
Unidad V: Métodos de Ordenamiento
Retícula ISIC-2010-224: Programa: AED-1026/2016
Esta presentación es parte del contenido del curso de Estructuras de Datos I impartido en la Universidad Rafael Landívar durante el año 2017.
Creado por Ing. Alvaro Enrique Ruano
Instituto Tecnológico Superior de Guasave
Ingeniería en Sistemas Computacionales
Estructura de Datos
Unidad V: Métodos de Ordenamiento
Retícula ISIC-2010-224: Programa: AED-1026/2016
La recursividad o recursión es una técnica de programación que consiste en expresar una solución en términos de sí misma. Se dice que los algoritmos recursivos aplican una técnica de "divide y vencerás", para reducir un problema complejo en subproblemas más pequeños y fáciles de resolver.
Esta presentación es parte del contenido del curso de Programación Avanzada impartido en la Universidad Rafael Landívar durante el año 2015.
Incluye los temas:
• Búsqueda por método secuencial
• Búsqueda por método binario
• Búsqueda por método hashing
Creado por Ing. Alvaro Enrique Ruano
La recursividad o recursión es una técnica de programación que consiste en expresar una solución en términos de sí misma. Se dice que los algoritmos recursivos aplican una técnica de "divide y vencerás", para reducir un problema complejo en subproblemas más pequeños y fáciles de resolver.
Esta presentación es parte del contenido del curso de Programación Avanzada impartido en la Universidad Rafael Landívar durante el año 2015.
Incluye los temas:
• Búsqueda por método secuencial
• Búsqueda por método binario
• Búsqueda por método hashing
Creado por Ing. Alvaro Enrique Ruano
Taller de compensaciones y gestión del cambio, que da un acercamiento general de la gestión de compensaciones y como gestionar el cambio en una empresa u organización.
Las listas, son estructuras secuenciales. En las listas ligadas dinámicas, el tamaño cambia durante la ejecución del programa. Es necesario almacenar al menos, la posición del primer elemento.
2. Estática vs Dinámica En un sentido general, un componente es estático cuando no se transforma a lo largo del tiempo, y por el contrario, es dinámico cuando evoluciona en el tiempo. Desde el punto de vista abstracto (lógico), las estructuras de datos también poseen ese atributo. De allí que una estructura es estática cuando su configuración no se modifica a lo largo de su uso. Y aquellas estructuras que sufren cambios en su composición, a lo largo del tiempo, son dinámicas. Es así que podemos agrupar las estructuras de datos en: Estáticas : vector, matriz, registro, cadena. Dinámicas : pila, cola, lista, árbol, grafo. Hasta el momento hemos estudiado las estructuras de datos estáticas, sus operaciones y aplicación. Veremos a continuación algunas de las estructuras dinámicas cuya “anatomía” se corresponde con el alcance de este curso, y en Algorítmica y Programación II profundizaremos su estudio e incorporaremos otras.
3. La pila: nivel lógico ¿Qué es una pila? Aunque los objetos de cada imagen son todos diferentes, cada uno ilustra un concepto común: la pila . Así, definiremos una pila como: Conjunto ordenado de elementos homogéneos, de los que se puede añadir nuevos elementos o quitar elementos existentes por la cabeza de la pila.
4. Se considera a la pila un grupo ordenado porque los elementos están dispuestos de acuerdo a cuánto tiempo llevan en la pila. Dado que los elementos se añaden y quitan sólo por la cabeza de la pila, el último elemento añadido es el primero en ser quitado. De esto se sintetiza el concepto de pila como “el Último en entrar es el Primero en salir” : LIFO (acrónimo en inglés de Last In First Out) Pila: estructura de datos en la que los elementos se añaden y quitan sólo por un extremo. Pero para definir el tipo de datos abstracto (TAD) Pila , no es suficiente la estructura lógica. Debemos definir también el conjunto de operaciones que permita al usuario acceder y manipular los elementos almacenados en una pila. Como la pila es una estructura dinámica, cambia conforme se añaden y quitan elementos en ésta.
5. Llamaremos Meter a la operación de añadir un elemento por la cabeza de la pila (Push) y Sacar a la operación que toma el elemento que está en la cabeza de la pila y lo quita (Pop). La pila debe ser creada para poder empezar a utilizarla, por lo que se crea una pila vacía. A esa operación la llamaremos CrearPila . Y para poder sacar elementos de una pila, debemos poder chequear si la pila contiene algún elemento, por lo que necesitamos una operación booleana que denominaremos PilaVacía . Puede ocurrir en alguna implementación que deba testearse si una pila está llena. En ese caso, la operación booleana se llamará PilaLlena. Pero esto es válido sólo en caso de que la implementación lo requiera. No desde el Tipo abstracto de datos (TAD). Las operaciones Meter y Sacar son las ventanas en el encapsulamiento de la pila, a través de las cuales pasan los datos de la pila. Estas operaciones son un paquete a través del cual se manejan todas las acciones sobre una pila, independientemente de la forma en que estén implementadas.
6. Uso de una pila en una aplicación Consideremos un procedimiento que lee una cadena e imprime sus caracteres en orden inverso. La cadena de entrada termina con un blanco, el que no debe imprimirse como parte de la cadena inversa: ImpInversa Repetir Leer carácter Si carácter <> blanco entonces Meter (Pila, carácter) Hasta carácter = blanco Mientras no PilaVacía(Pila) hacer comienza Sacar (Pila, carácter) Imprimir carácter termina
7. Pendientes Plazo fijo Service PC Arreglar Bomba agua ¿Qué es lo primero que se va a realizar? ¿luego? ¿finalmente? Pendientes está vacío, por lo que las tareas han sido satisfechas
8. La cola: nivel lógico ¿Qué es una cola? En cada imagen vemos objetos diferentes, pero cada uno ilustra un concepto común: la cola . Así, definiremos una cola como: Conjunto ordenado de elementos homogéneos, de los que se puede añadir nuevos elementos por un extremo y eliminar elementos existentes por el otro.
9. Se considera a la cola un grupo ordenado porque los elementos están dispuestos de acuerdo a cuánto tiempo llevan en la misma. Dado que los elementos se añaden por el final de la cola, el primer elemento añadido es el primero en ser quitado. De esto se sintetiza el concepto de cola como “el Primero en entrar es el Primero en salir”: FIFO (acrónimo en inglés de First In First Out) Cola: estructura de datos en la que los elementos se añaden por un extremo( el final) y quitan por el otro (el frente). Pero para definir el tipo de datos abstracto (TAD) Cola , no es suficiente la estructura lógica. Debemos definir también el conjunto de operaciones que permita al usuario acceder y manipular los elementos almacenados en una cola. Como ésta es una estructura dinámica, cambia conforme se eliminan y suprimen elementos.
10. Llamaremos InsCola a la operación de añadir un elemento por el final de la cola y SupCola a la operación que toma el elemento que está en en frente de la cola y lo quita. La cola debe ser creada para poder empezar a utilizarla, por lo que se crea una cola vacía. A esa operación la llamaremos CrearCola . Y para poder sacar elementos de una cola, debemos poder chequear si la cola contiene algún elemento, por lo que necesitamos una operación booleana que denominaremos ColaVacía . Puede ocurrir en alguna implementación que deba testearse si una cola está llena. En ese caso, la operación booleana se llamará ColaLlena. Pero esto es válido sólo en caso de que la implementación lo requiera. No desde el TAD. Las operaciones InsCola y SupCola son las ventanas en el encapsulamiento de la cola, a través de las cuales pasan los datos de la cola. Estas operaciones son un paquete a través del cual se manejan todas las acciones sobre una cola, independientemente de la forma en que estén implementadas.
11. Uso de una cola en una aplicación Consideremos un procedimiento que lee dos subcadenas de caracteres, separadas por un punto. Y determina si ambas subcadenas son iguales o no. Iguales verdadero Repetir Leer carácter Si carácter <> punto entonces Ins_Cola (frase, carácter) Hasta carácter =punto Mientras iguales ^ no ColaVacía(frase) hacer comienza Leer carácter Sup_Cola (frase, letra) si carácter/=letra entonces iguales falso fin si termina mientras Si iguales entonces escribir “ambas subcadenas son iguales” fin si
12. Fotocopiadora Güemes Rosas Quiroga ¿A quién atienden primero? ¿luego? ¿quién sigue en la cola? Fotocopiadora está vacía. Pueden ir a tomar mate al fondo!!!!! Urquiza ¿y ahora?
13. La lista: nivel lógico ¿Qué es una lista? En cada imagen vemos objetos diferentes, pero cada uno ilustra un concepto común: la lista enlazada . Así, definiremos una lista enlazada como: CD Disco Duro Diskette Memoria SD DVD Estructura de datos organizada linealmente, que se caracteriza porque cada uno de sus elementos tiene que indicar dónde se encuentra el siguiente elemento de la lista. 1 Aguirre 2 Barilá 3 Colombo
14. Cada elemento de la lista unaLista se almacena en un nodo que contiene la información y un valor que indica en dónde se encuentra el siguiente dato de la lista Veamos el siguiente esquema: Q Z R U unaLista
15. La lista debe ser inicializada para poder empezar a utilizarla. Con la operación Crear se compone una lista vacía. Llamaremos Insertar a la operación de añadir un elemento y Suprimir a la operación de tomar un elemento existente en ésta. Para poder sacar elementos de una lista, debemos poder chequear si la lista contiene algún elemento, por lo que necesitamos una operación booleana que denominaremos Vacía . Dado que la precondición del procedimiento Suprimir es que el elemento exista en la lista, agregaremos una función Está cuyo valor será verdadero o falso según la existencia o no de valor en la lista. Las operaciones Insertar y Suprimir son las ventanas en el encapsulamiento de la lista, a través de las cuales pasan los datos de ésta. Puede ocurrir que durante un proceso debamos trabajar nuevamente con una Lista desde su estado vacío. Para ello, deberemos limpiarla, es decir, liberar todos sus nodos. Esa acción se logra mediante el procedimiento Limpiar. Todas las operaciones conforman un paquete a través del cual se maneja cada una de las acciones sobre una lista. ¿Qué operaciones se necesitan?
16.
17. Q Z R U Lista enlazada B H R W Lista enlazada ordenada
20. ¿Qué las diferencia? La diferencia entre cada una de ellas es el modelo de datos que representa. En una lista enlazada, el orden de los valores es irrelevante. Por lo que se puede insertar desde cualquier punto, siempre y cuando se conserven los enlaces. En general se simplifica insertando por el comienzo. Y se suprime el elemento buscado, por lo que puede estar en cualquier posición. En una lista enlazada ordenada, el elemento que se inserta debe estar en la posición que le corresponde según el criterio de orden, por lo que , para insertar, deberá buscarse primero la posición en la que debe ir y luego acomodar los enlaces. En una lista circular no hay ni primer elemento ni último. Veremos su TAD próximamente. En una lista doblemente enlazada, cada elemento está enlazado con el siguiente y con el anterior, y si además están ordenados, para insertar deberemos tener en cuenta la posición en la que deberá ubicarse. En Algorítmica y Programación II las estudiaremos en profundidad.
21. Arbol: nivel lógico ¿Qué es un árbol? En cada imagen vemos objetos diferentes, pero cada uno ilustra un concepto común: un árbol. La característica que lo hace propio es la jerarquización de objetos, los enlaces que pueden ser múltiples y el recorrido que puede plantearse desde una raiz, ya sea desde la tierra (el árbol perteneciente al reino vegetal), desde la jerarquía máxima (el Director de una organización), o desde la ascendencia o descendencia de un árbol genealógico. Director Gerente de Personal Gerente de Producción Gerente de Sistemas Programadores Jefe de servicio Secretaria Liquidaciones
22.
23. Árbol general es aquel en el que no se considera ninguna limitación en el grado máximo de sus nodos. Los árboles n-arios son aquellos en los que el grado máximo de sus nodos es n , siendo n un número positivo. Así, comenzaremos nuestro estudio de los Árboles Binarios. El nodo raiz es el 9. El hijo derecho de 9 es 15. El hijo derecho de 18 es 25. El hijo izquierdo de 9 es 5. El hijo izquierdo de 12 es 10. El nodo padre de 3 y 7 es 5. El nodo padre de 10 es 12. Los nodos hojas son 1, 7, 10 y 25. Los hermanos son (3 y 7), (12 y 18), (5 y 15). Los ancestros de 10 son: 12, 15 y 9. Los descendientes de 5 son 3, 1 y 7. El subárbol derecho de 9 es el que tiene raiz al 15. El subárbol izquierdo de 9 es el que tiene raiz al 5. El nodo de nivel 0 es el 9. Los nodos de nivel 1 son 5 y 15. Los nodos de nivel 2 son 3,7,12 y 18. Los nodos de nivel 3 son 1, 10 y25. No pulse el mouse
24. Árbol Binario de Búsqueda Un árbol binario de búsqueda es una estructura de datos que guarda información no repetida, en el que cada nodo apunta como máximo a otros dos nodos, y además cumplen con un ordenamiento de tal forma que para cada elemento del ABB, los elementos menores están a su izquierda (subárbol izquierdo), y los mayores a su derecha (subárbol derecho).
25. El árbol se debe inicializar para poder empezar a utilizarlo. Con la operación Crear se compone un árbol vacío. Insertar es la operación de añadir un elemento y Suprimir a la operación de tomar un elemento existente en éste. Para poder sacar elementos de un árbol, debemos poder chequear si éste contiene algún elemento, por lo que necesitamos una operación booleana que denominaremos Vacío . Las operaciones Insertar y Suprimir son las ventanas en el encapsulamiento del árbol, a través de las cuales pasan los datos de éste. Obviamente que deberá especificarse la operación Buscar , y veremos también que podemos visualizar los elementos de un árbol, por lo que se lo deberá Recorrer de diversas maneras. Puede ocurrir que durante un proceso debamos trabajar nuevamente con un Arbol desde su estado vacío. Para ello, deberemos limpiarlo, es decir, liberar todos sus nodos. Esa acción se logra mediante el procedimiento Limpiar . Todas las operaciones conforman un paquete a través del cual se maneja cada una de las acciones sobre un árbol. ¿Qué operaciones se necesitan?
26. Recorridos de un árbol binario En las siguientes diapositivas verá, a través del cambio de color, cómo se recorren los nodos en los distintos tipos de recorrido. Hay tres formas de recorrer un árbol binario: Inorden , Preorden y Posorden . Cada una de éstas tiene su particularidad, y por lo tanto, su aplicación específica. Veamos primero cada forma y en las siguientes diapositivas las ilustraremos. En el recorrido Inorden , cada nodo se recorre entre su subárbol izquierdo y su subárbol derecho En el recorrido Preorden , cada nodo se recorre antes de su subárbol izquierdo y su subárbol derecho En el recorrido Posorden , cada nodo se recorre después de su subárbol izquierdo y su subárbol derecho
27. Recorrido Inorden InOrden : B D E H K M N Q R S T V W Z N M H B K D E S R Q W Z V T Raiz Click para ver la evolución
28. PreOrden: N E D B K H M S R Q W V T Z N M H B K D E S R Q W Z V T Recorrido Preorden Raiz Click para ver la evolución
29. PosOrden : B D H M K E Q R T V Z W S N Raiz N M H B K D E S R Q W Z V T Recorrido Posorden Click para ver la evolución