estructuras dinámicas

29
Estructuras Dinámicas Una primera aproximación

Upload: patriciau

Post on 13-Jun-2015

4.897 views

Category:

Education


0 download

TRANSCRIPT

Page 1: Estructuras dinámicas

Estructuras DinámicasUna primera aproximación

Page 2: Estructuras dinámicas

Algorítmica y Programación I

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.

Page 3: Estructuras dinámicas

Algorítmica y Programación I

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.

Page 4: Estructuras dinámicas

Algorítmica y Programación I

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.

Page 5: Estructuras dinámicas

Algorítmica y Programación I

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.

Page 6: Estructuras dinámicas

Algorítmica y Programación I

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

RepetirLeer carácterSi carácter <> blanco

entonces Meter (Pila, carácter)Hasta carácter = blancoMientras no PilaVacía(Pila) hacer

comienzaSacar (Pila, carácter)Imprimir caráctertermina

Page 7: Estructuras dinámicas

Algorítmica y Programación I

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

Page 8: Estructuras dinámicas

Algorítmica y Programación I

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.

Page 9: Estructuras dinámicas

Algorítmica y Programación I

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.

Page 10: Estructuras dinámicas

Algorítmica y Programación I

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.

Page 11: Estructuras dinámicas

Algorítmica y Programación I

Uso de una cola en una aplicaciónConsideremos un procedimiento que lee dos subcadenas de caracteres, separadas por un punto. Y determina si ambas subcadenas son iguales o no.

IgualesverdaderoRepetirLeer carácterSi carácter <> punto entonces Ins_Cola (frase, carácter)Hasta carácter =puntoMientras iguales ^ no ColaVacía(frase) hacer

comienzaLeer carácterSup_Cola (frase, letra)si carácter/=letra entonces iguales falso

fin sitermina mientras

Si iguales entonces escribir “ambas subcadenas son iguales”fin si

Page 12: Estructuras dinámicas

Algorítmica y Programación I

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?

Page 13: Estructuras dinámicas

Algorítmica y Programación I

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:

1 Aguirre

2 Barilá

3 Colombo

CDDisco Duro DisketteMemoria SDDVD

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.

Page 14: Estructuras dinámicas

Algorítmica y Programación I

Q Z R U

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:

unaLista

Page 15: Estructuras dinámicas

Algorítmica y Programación I

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?

Page 16: Estructuras dinámicas

Algorítmica y Programación I

¿Qué variedades de listas hay?

•Lista enlazada

•Lista enlazada ordenada

•Lista enlazada circular

•Lista doblemente enlazada

•Lista doblemente enlazada ordenada

•Lista doblemente enlazada circular

Page 17: Estructuras dinámicas

Algorítmica y Programación I

Q Z R U

Lista enlazada

B H R W

Lista enlazada ordenada

Page 18: Estructuras dinámicas

Algorítmica y Programación I

Lista enlazada circular

Juan Pepe Tita Coca

Lista doblemente enlazada

W PT D

Page 19: Estructuras dinámicas

Algorítmica y Programación I

Lista doblemente enlazada circular

B AK R

Lista doblemente enlazada ordenada

F YJ M

Page 20: Estructuras dinámicas

Algorítmica y Programación I

¿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.

Page 21: Estructuras dinámicas

Algorítmica y Programación I

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

ProgramadoresJefe de servicioSecretaria

Liquidaciones

Abuela

Tíos

Abuelo

Yo

BisAbuelasBisAbuelos

TataraAbuelas

TataraAbuelos

Primos

MadrePadre

Page 22: Estructuras dinámicas

Algorítmica y Programación I

Un árbol es una estructura de datos en forma jerárquica o de niveles, en cuyos elementos puede existir una relación de uno a muchos (1:n). Veamos la terminología básica de las estructuras jerárquicas o árboles

•Nodo raíz: es el primer elemento de un árbol. No tiene ascendiente.

•Nodo padre: es el nodo que tiene por lo menos un hijo.

•Hijo: descendientes de un nodo

•Nodo hoja: nodo que no tiene ningún descendiente

•Nodos hermanos:nodos que tienen un mismo padre.

•Rama: relación que conecta un padre con un hijo.

•Ancestros:nodo padre de un nodo o padre de algún nodo ancestro.

•Descendientes: hijo de un nodo o el hijo de otro descendiente de ese nodo.

•Subárbol : conjunto de descendientes de un nodo por una de las ramas.

•Nivel de un nodo: distancia desde la raíz. Ésta está en el nivel cero.

•Grado de un nodo: número de hijos que tieneNo pulse el

mouse

Page 23: Estructuras dinámicas

Algorítmica y Programación I

Á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.

9

5

3

1

7

15

12

10

18

25

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

Page 24: Estructuras dinámicas

Algorítmica y Programación I

Á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).

24

43

1

16

12 31

25

20

38

26

45

56 17

45

56 17

45

26 57

45

15

45

59

Page 25: Estructuras dinámicas

Algorítmica y Programación I

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?

Page 26: Estructuras dinámicas

Algorítmica y Programación I

En las siguientes diapositivas verá, a través del cambio de color, En las siguientes diapositivas verá, a través del cambio de color, cómo se recorren los nodos en los distintos tipos de recorrido.cómo se recorren los nodos en los distintos tipos de recorrido.

Recorridos de un árbol binario

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

Page 27: Estructuras dinámicas

Algorítmica y Programación I

InOrden: B D E H K M N Q R S T V W Z

RaizN

MHB

KD

E S

R

Q

W

ZV

T

Recorrido Inorden

Click para ver la evolución

Page 28: Estructuras dinámicas

Algorítmica y Programación I

PreOrden: N E D B K H M S R Q W V T Z

RaizN

MHB

KD

E S

R

Q

W

ZV

T

Recorrido Preorden

Click para ver la evolución

Page 29: Estructuras dinámicas

Algorítmica y Programación I

PosOrden: B D H M K E Q R T V Z W S N

RaizN

MHB

KD

E S

R

Q

W

ZV

T

Recorrido Posorden

Click para ver la evolución