• No se han encontrado resultados

Estructuras de Datos

N/A
N/A
Protected

Academic year: 2021

Share "Estructuras de Datos"

Copied!
14
0
0

Texto completo

(1)

. .

M. Aldea, M. González, P. Sánchez

Estructuras de Datos 03/10/11 1

Estructuras de Datos

Tema 1. Programación Imperativa de Computadores

Tema 2. Fundamentos de Complejidad Algorítmica

Tema 3. Técnicas de Implementación

Tema 4. concepto y especificación de Tipos Abstractos de Datos (TADs)

Tema 5. Estructuras de datos lineales Tema 6. Estructuras de datos jerárquicas

. .

M. Aldea, M. González, P. Sánchez

Estructuras de Datos 03/10/11 2

Bibliografía

Sahni, Sartaj, "Data structures, algorithms, and applications in Java". McGraw Hill, 2000

Weiss, Mark Allen, "Estructuras de datos y algoritmos". Addison-Wesley Iberoamericana, 1995.

Alfred V. Aho, John E. Hopcroft, Jeffrey D. Ullman, "Data structures and algorithms". Addison-Wesley, 1983.

Weiss, Mark Allen, "Estructuras de datos en Java : compatible con Java 2". Addison-Wesley, 2000

Michael T. Goodrich, Roberto Tamassia, "Data structures and algorithms in Java". John Wiley & Sons, 2006.

. .

M. Aldea, M. González, P. Sánchez

Objetivos

Conocer las principales técnicas de implementación de los principales tipos abstractos de datos

Conocer las ventajas e inconvenientes de las distintas técnicas de acuerdo a su complejidad espacial y temporal

(2)

Tema 1. Técnicas de Implementación . .

M. Aldea, M. González, P. Sánchez

Estructuras de Datos 03/10/11 4

Tema 1.

Técnicas de Implementación

1. Introducción

2. Estructuras de datos lineales

- Implementación mediante arrays, enlazado mediante punteros y cursores

3. Tablas hash

- Funciones de hashing. Técnicas de resolución de colisiones: abierto y cerrado. Implementación de tablas hash

4. Estructuras arbóreas

- Árboles binarios y de búsqueda. Árboles binarios equilibrados, Árboles AVL y Árboles rojinegros. Implementación de árboles

Tema 1. Técnicas de Implementación 1. Introducción .

M. Aldea, M. González, P. Sánchez

Estructuras de Datos 03/10/11 5

1

Introducción

Estructura de Datos:

Forma sistemática de organizar y almacenar datos

Su elección estará guiada por conceptos como: eficiencia temporal o espacial, facilidad de uso, escalabilidad, ... Constituyen una pieza fundamental de cualquier programa Cualquier programa (no trivial) requiere el uso de estructuras de datos para la gestión de los datos que maneja:

contactos de una agenda

diccionario con palabras y sus significados facturas, clientes y proveedores de una empresa

características y relaciones entre los participantes en un juego ...

Tema 1. Técnicas de Implementación 1. Introducción .

Estructuras de datos más utilizadas

En este tema veremos las estructuras de datos más habituales: Estructuras de datos lineales

Tablas hash (mapas) Árboles

(3)

Tema 1. Técnicas de Implementación 1. Introducción .

M. Aldea, M. González, P. Sánchez

Estructuras de Datos 03/10/11 7

Concepto de Tipo Abstracto de Datos

Tipo Abstracto de Datos (TAD)

Un tipo, es decir un conjunto de individuos

Junto con una serie de operaciones (básicas) aplicables a dicho conjunto de individuos

Que se define de forma independiente a su representación

Ejemplo: TAD "lista"

Tipo: secuencia de un número finito de elementos, en la que la posición de dichos elementos en la secuencia es relevante Operaciones: añade, elimina, busca, obtiene, ...

(En el tema 4 veremos una manera más formal de especificar un TAD)

Tema 1. Técnicas de Implementación 1. Introducción .

M. Aldea, M. González, P. Sánchez

Estructuras de Datos 03/10/11 8

Estructura de Datos vs. TAD

Los TADs se implementan utilizando estructuras de datos

algunas EDs serán más eficientes que otras para implementar un TAD determinado

Lista

ListaArray ListaSimpleEnlace

TAD

En este tema veremos las estructuras de datos básicas, en el tema 4 la especificación formal de TADs

y en los temas 5 y 6 los TADs más importantes

ListaDobleEnlace ...

EDs con las que se puede implementar el TAD

Tema 1. Técnicas de Implementación 2. Estructuras de datos lineales .

M. Aldea, M. González, P. Sánchez

2

Estructuras de datos lineales

Estructuras de datos en las que sus elementos se organizan como una secuencia:

{e1, e2, ..., en} n>=0

Todos sus elementos (ei) son del mismo tipo cuando n=0 se trata de una secuencia vacía

Operaciones típicas a realizar:

añadir un elemento (primero, intermedio, último) eliminar un elemento (primero, intermedio, último) acceder a un elemento

recorrer todos los elemento ...

(4)

Tema 1. Técnicas de Implementación 2. Estructuras de datos lineales 2.1. Implementación mediante array

M. Aldea, M. González, P. Sánchez

Estructuras de Datos 03/10/11 10

2.1

Implementación mediante array

Array en el que cada casilla almacena un elemento Para conocer la parte ocupada se utiliza un contador

su valor indica el número de elementos de la secuencia y, a la vez, el índice del comienzo de la zona libre

Primer Elemento Segundo Elemento Último Elemento Elementos numEle 0 1 length-1 Ocupado Libre ... ... 7 8 8

Tema 1. Técnicas de Implementación 2. Estructuras de datos lineales 2.1. Implementación mediante array

M. Aldea, M. González, P. Sánchez

Estructuras de Datos 03/10/11 11

Eficiencia de las operaciones

El acceso posicional es inmediato O(1)

en el array tenemos acceso posicional de forma natural La inserción al final es eficiente O(1)

meter el nuevo elemento en la casilla numEle incrementar numEle

La inserción en la posición i es O(n) hacer hueco

- mover las casillas en el rango [i,numEle-1] una casilla hacia adelante, yendo desde el final al principio

meter el nuevo elemento en la casilla i incrementar el cursor numEle

Tema 1. Técnicas de Implementación 2. Estructuras de datos lineales 2.1. Implementación mediante array Eficiencia de las operaciones (cont.)

La eliminación del elemento final es eficiente O(1) almacenar el elemento en la casilla numEle-1 decrementar el cursor numEle

retornar el elemento almacenado La eliminación de la posición i es O(n)

almacenar el elemento de la casilla i en una variable cerrar el hueco

- mover las casillas en el rango [i+1,numEle-1] una casilla hacia atrás, yendo del principio hacia el final

decrementar el cursor numEle

retornar la variable con el elemento almacenado

Ver pseudocódigo e implementación en Java en la web de la asignatura

(5)

Tema 1. Técnicas de Implementación 2. Estructuras de datos lineales 2.1. Implementación mediante array

M. Aldea, M. González, P. Sánchez

Estructuras de Datos 03/10/11 13

Eficiencia de las operaciones (cont.)

Resumen de la eficiencia de las operaciones:

Operación Complejidad temporal

añade intermedio O(n) añade último O(1) elimina intermedio O(n) elimina último O(1) obtiene elemento i-ésimo O(1) obtiene tamaño lista O(1)

Tema 1. Técnicas de Implementación 2. Estructuras de datos lineales 2.1. Implementación mediante array

M. Aldea, M. González, P. Sánchez

Estructuras de Datos 03/10/11 14

Cambio dinámico de tamaño

Es posible implementar una lista ilimitada mediante arrays Cuando la lista está llena y se intenta añadir un nuevo elemento:

1.se crea un nuevo array (por ejemplo del doble de tamaño) 2.se copian todos los elementos del array viejo en el nuevo 3.se libera la memoria del array viejo

¡Añadir al final sigue tardando un tiempo amortizado constante! A medida que se van añadiendo elementos al final de la lista

algunas adiciones tardan mucho (las de las copias entre arrays) pero ese tiempo se amortiza entre las demás adiciones

de forma que el tiempo promedio por adición es constanteO(1) o, dicho de otra forma, el tiempo de n adiciones es O(n)

Tema 1. Técnicas de Implementación 2. Estructuras de datos lineales 2.1. Implementación mediante array

M. Aldea, M. González, P. Sánchez

Cambio dinámico de tamaño (cont.)

c t

2c 4c 8c

c: capacidad inicial del array c�2c

2c�4c

4c�8c

O(n)

n n: número de adiciones al final el array

(6)

Tema 1. Técnicas de Implementación 2. Estructuras de datos lineales 2.2. Recorrido de una secuencia: Iterador

M. Aldea, M. González, P. Sánchez

Estructuras de Datos 03/10/11 16

2.2

Recorrido de una secuencia: Iterador

Un iterador nos permite recorrer los elementos de una estructura de datos lineal

pasando una única vez por cada uno de los elementos Operaciones básicas de un iterador:

constructor: posiciona el iterador al principio de la secuencia hasNext: indica si hay más elementos (no se ha llegado al final) next: retorna el siguiente elemento y avanza el iterador

Otras operaciones habituales:

hasPrevious: indica si no se está al comienzo de la secuencia previous: retorna el elemento anterior y retrocede el iterador add: inserta un elemento en la posición del iterador

remove: elimina el último elemento retornado por el iterador

Tema 1. Técnicas de Implementación 2. Estructuras de datos lineales 2.2. Recorrido de una secuencia: Iterador

M. Aldea, M. González, P. Sánchez

Estructuras de Datos 03/10/11 17

Recorrido de una secuencia

Sin usar iterador:

tamaño : Entero := lista.size() para i desde 0 hasta tamaño-1 hacer hace_algo(lista.get(i))

finhacer Usando iterador:

Iterador iter := lista.iterator() mientras iter.hasNext() hacer hace_algo(iter.next()) finhacer

En la implementación con array ambos recorridos son igual de eficientes O(n) (puesto que tanto get como next son O(1))

un poco más rápido con iterador (menos comprobaciones) en otras implementaciones el iterador es mucho más eficiente

Tema 1. Técnicas de Implementación 2. Estructuras de datos lineales 2.2. Recorrido de una secuencia: Iterador

Iterador en la implementación mediante array

Muy sencillo de implementar: cursor con el valor del índice del

próximo elemento a retornar 0 1 2 3 numEle 0 iterador a hasNext()�true next() �a[0] 1 3 2 hasNext()�true next() �a[1] hasNext()�true next() �a[2] hasNext()�false

(7)

Tema 1. Técnicas de Implementación 2. Estructuras de datos lineales 2.3. Implementación mediante listas simplemente enlazadas

M. Aldea, M. González, P. Sánchez

Estructuras de Datos 03/10/11 19

2.3

Implementación mediante listas

simplemente enlazadas

Basadas en una "cadena" de celdas enlazadas mediante punteros

cada celda tiene un puntero a la siguiente la última celda tiene un puntero a null

Siendo más exactos, la mayoría de las implementaciones tienen esta estructura:

a1 a2 ... an

...

a1 a2 an

Tema 1. Técnicas de Implementación 2. Estructuras de datos lineales 2.3. Implementación mediante listas simplemente enlazadas

M. Aldea, M. González, P. Sánchez

Estructuras de Datos 03/10/11 20

Operaciones básicas de inserción y extracción

Inserción de un nuevo elemento en la cadena

Eliminación de un elemento de la cadena

...

... a b c

z

...

... a b c

Tema 1. Técnicas de Implementación 2. Estructuras de datos lineales 2.3. Implementación mediante listas simplemente enlazadas

M. Aldea, M. González, P. Sánchez

Uso de nodos de cabecera

El primer nodo de la lista es un nodo especial de cabecera

+La inserción y eliminación del primer elemento no es un caso especial

-Es un pequeño "truco"

-Utiliza algo de memoria extra

cabecera a1 ... an

principio

En las trasparencias y en el ejemplo de implementación ListaSimpleEnlace.java se utiliza el nodo de cabecera

(8)

Tema 1. Técnicas de Implementación 2. Estructuras de datos lineales 2.3. Implementación mediante listas simplemente enlazadas

M. Aldea, M. González, P. Sánchez

Estructuras de Datos 03/10/11 22

Uso de nodos de cabecera (cont.)

Sin nodo cabecera

+No hay "trucos"

-La inserción y eliminación del primer elemento es un caso especial

a2 ... an

principio

a1

El pseudocódigo lista_simple_enlace no utiliza nodo de cabecera

Tema 1. Técnicas de Implementación 2. Estructuras de datos lineales 2.3. Implementación mediante listas simplemente enlazadas

M. Aldea, M. González, P. Sánchez

Estructuras de Datos 03/10/11 23

Iterador en listas simplemente enlazadas

El acceso posicional es muy costoso

acceder al elemento n-ésimo es O(n)

Para recorrer la lista es preferible utilizar el iterador la operación next es O(1)

Por eficiencia las operaciones add y remove se añaden al iterador add: inserta el elemento justo antes del que será devuelto por

la siguiente llamada a next (definición en el API de Java) remove: elimina el elemento retornado por la última llamada a

next o previous (definición en el API de Java)

pueden utilizarse otras definiciones alternativas para add y remove

Tema 1. Técnicas de Implementación 2. Estructuras de datos lineales 2.3. Implementación mediante listas simplemente enlazadas

Implementación del iterador

El iterador de la lista contiene

previo: puntero al elemento a retornar por previous (o dicho de otra forma, al anterior al que debe retornar next)

antUltRet: puntero al elemento anterior al último retornado por next o previous

- utilizado por remove

a1 a2 ... an Celdas Cabecera lista principio iterador antUltRet previo

(9)

Tema 1. Técnicas de Implementación 2. Estructuras de datos lineales 2.3. Implementación mediante listas simplemente enlazadas

M. Aldea, M. González, P. Sánchez

Estructuras de Datos 03/10/11 25

Situación inicial del iterador

a1 a2 ... an Celdas Cabecera lista principio iterador antUltRet previo

Tema 1. Técnicas de Implementación 2. Estructuras de datos lineales 2.3. Implementación mediante listas simplemente enlazadas

M. Aldea, M. González, P. Sánchez

Estructuras de Datos 03/10/11 26

Avance del iterador: next

b c ... iterador 1) situación inicial b c ... 2) después de next antUltRet previo iterador antUltRet previo a a 3) next retorna c

Tema 1. Técnicas de Implementación 2. Estructuras de datos lineales 2.3. Implementación mediante listas simplemente enlazadas

M. Aldea, M. González, P. Sánchez

Avance del iterador: previous

b c ... iterador 1) situación inicial b c ... 2) después de previous antUltRet previo iterador antUltRet previo a a

para retroceder es preciso ir al principio de la lista y buscar el elemento anterior al previo

(10)

Tema 1. Técnicas de Implementación 2. Estructuras de datos lineales 2.3. Implementación mediante listas simplemente enlazadas

M. Aldea, M. González, P. Sánchez

Estructuras de Datos 03/10/11 28

Diagrama de añadir

a b ... 1) antes de añadir a b ... 2) después de añadir x previo próximo iterador antUltRet previo iterador antUltRet previo ... previo próximo

Tema 1. Técnicas de Implementación 2. Estructuras de datos lineales 2.3. Implementación mediante listas simplemente enlazadas

M. Aldea, M. González, P. Sánchez

Estructuras de Datos 03/10/11 29

Diagrama de borra (después de próximo)

a b c ... 1) antes de borrar a b c ... 2) después de borrar iterador antUltRet previo iterador antUltRet previo

Tema 1. Técnicas de Implementación 2. Estructuras de datos lineales 2.3. Implementación mediante listas simplemente enlazadas

Diagrama de borra (después de previo)

a b c ... 1) antes de borrar a b c ... 2) después de borrar iterador antUltRet previo iterador antUltRet previo

(11)

Tema 1. Técnicas de Implementación 2. Estructuras de datos lineales 2.4. Implementación mediante listas doblemente enlazadas

M. Aldea, M. González, P. Sánchez

Estructuras de Datos 03/10/11 31

2.4

Implementación mediante listas doblemente

enlazadas

En una lista simplemente enlazada, las operaciones para acceder a la posición última y retroceder el iterador son costosas (O(n)) Las listas doblemente enlazadas evitan este problema

"cadena" de celdas con punteros al anterior y al siguiente

a1 a2 ... an

Elementos

lista principio

...

fin También podrían implementarse usando

nodos "falsos" (cabecera y cola)

Tema 1. Técnicas de Implementación 2. Estructuras de datos lineales 2.4. Implementación mediante listas doblemente enlazadas

M. Aldea, M. González, P. Sánchez

Estructuras de Datos 03/10/11 32

Operaciones básicas de inserción y extracción

Inserción de un nuevo elemento en la cadena

Eliminación de un elemento de la cadena

...

... a b c

z

...

... a b c

Tema 1. Técnicas de Implementación 2. Estructuras de datos lineales 2.4. Implementación mediante listas doblemente enlazadas

M. Aldea, M. González, P. Sánchez

Iterador de la lista

El iterador de la lista contiene

proximo: puntero al elemento a retornar por next (o dicho de otra forma, al posterior al que debe retornar previous)

ultRet: puntero al último elemento retornado por next o previous

- utilizado por remove

lista fin iterador ultRet proximo a1 a2 ...... an principio

(12)

Tema 1. Técnicas de Implementación 2. Estructuras de datos lineales 2.4. Implementación mediante listas doblemente enlazadas

M. Aldea, M. González, P. Sánchez

Estructuras de Datos 03/10/11 34

Situación inicial del iterador

lista fin iterador ultRet proximo a1 a2 ...... an principio

Tema 1. Técnicas de Implementación 2. Estructuras de datos lineales 2.4. Implementación mediante listas doblemente enlazadas

M. Aldea, M. González, P. Sánchez

Estructuras de Datos 03/10/11 35

Iterador al final de la lista

lista fin iterador ultRet proximo a1 a2 ...... an principio

Tema 1. Técnicas de Implementación 2. Estructuras de datos lineales 2.4. Implementación mediante listas doblemente enlazadas

Avance del iterador: next

b ... iterador 1) situación inicial 2) después de next ultRet proximo iterador ultRet proximo a c b ... a c 3) next retorna b

(13)

Tema 1. Técnicas de Implementación 2. Estructuras de datos lineales 2.4. Implementación mediante listas doblemente enlazadas

M. Aldea, M. González, P. Sánchez

Estructuras de Datos 03/10/11 37

Avance del iterador: previous

b ... iterador 1) situación inicial 2) después de previo ultRet proximo iterador ultRet proximo a c b ... a c 2) previous retorna b

Tema 1. Técnicas de Implementación 2. Estructuras de datos lineales 2.4. Implementación mediante listas doblemente enlazadas

M. Aldea, M. González, P. Sánchez

Estructuras de Datos 03/10/11 38

Diagrama de añade

b ... iterador 1) situación inicial 2) después de añade ultRet proximo iterador ultRet proximo a c b ... a c ... a nuevaCelda

Tema 1. Técnicas de Implementación 2. Estructuras de datos lineales 2.4. Implementación mediante listas doblemente enlazadas

M. Aldea, M. González, P. Sánchez

Diagrama de borra (después de next)

b ... iterador 1) situación inicial 2) después de borra ultRet proximo iterador ultRet proximo a c b ... a c

(14)

Tema 1. Técnicas de Implementación 2. Estructuras de datos lineales 2.4. Implementación mediante listas doblemente enlazadas

M. Aldea, M. González, P. Sánchez

Estructuras de Datos 03/10/11 40

Diagrama de borra (después de previous)

b ... iterador 1) situación inicial 2) después de borra ultRet proximo iterador ultRet proximo a c b ... a c

Tema 1. Técnicas de Implementación 2. Estructuras de datos lineales 2.4. Implementación mediante listas doblemente enlazadas

M. Aldea, M. González, P. Sánchez

Estructuras de Datos 03/10/11 41

Comparación de las implementaciones

Eficiencia temporal:

1 Hay que encontrar el elemento (O(n)) antes de añadirle/eliminarle 2 Se puede hacer en O(1) añadiendo a la lista un puntero al final

Operación Array Simple enlace Doble enlace

añade primero/intermedio/último O(n) O(n) O(1) O(1) O(n)1 O(n)2 elimina primero/intermedio/último O(n) O(n) O(1) O(1) O(n)1 O(n)2

obtiene elemento i-ésimo O(1) O(n)

iterador.next O(1)

iterador.previous O(1) O(n) O(1)

iterador.add O(n) O(1)

iterador.remove O(n) O(1)

Tema 1. Técnicas de Implementación 2. Estructuras de datos lineales 2.4. Implementación mediante listas doblemente enlazadas Comparación de las implementaciones (cont.)

Lista enlazada vs. implementación con array:

+No acotada, fácil crecimiento

+Sólo se utiliza la memoria que realmente se necesita

+Desplazar subestructuras es O(1)

-Acceso posicional más costoso

Referencias

Documento similar

La solución que se ha planteado, es que el paso o bien se hiciese exclusivamente por el adarve de la muralla, o que una escalera diese acceso por la RM evitando la estancia (De

Asignar pesos a las zonas en estudio es necesario si queremos realizar un An´ alisis de datos espaciales supuesto que ´ estos sean ´ Areas, fundamentalmen- te con el prop´ osito

Un sin´ onimo de tipo nos permite definir un nuevo nombre para un tipo ya existente, como el ya conocido tipo String que no es otra cosa que un sin´ onimo para [Char].. Los

El nombre de la norma, su cabecera, (ley, Decreto, Órden, etc) nos dirá cual es su rango y su prevalencia sobre otras. El principio de racionalidad de las normas se

El objetivo principal del proyecto es la creación de una aplicación web para la visualización del comportamiento de diferentes algoritmos sobre

De lo anterior puede concluirse que el thesaurus es un instrumento lingüístico, utilizado en el ámbito de la recuperación automática de documentación, compuesto por un vocabulario

En las estructuras de datos dinámicas el tamaño y su forma es variable a lo largo de un programa, es decir, la memoria se reserva a tiempo de corrida del programa; este tipo

Tanto el nuevo modelo propuesto para el An´alisis de Datos Acoplados T 3-P CA como los mencionados anteriormente utilizan distintos modelos para el An´alisis de la Interac- ci´on