14
. . 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 Estructuras de Datos 03/10/11 3 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

Estructuras de Datos - ocw.unican.es · Estructuras de Datos 03/10/11 1 Estructuras de Datos Tema 1. Programación Imperativa de Computadores Tema 2. Fundamentos de Complejidad Algorítmica

  • Upload
    dokiet

  • View
    231

  • Download
    0

Embed Size (px)

Citation preview

. .

M. Aldea, M. González, P. SánchezEstructuras 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ánchezEstructuras 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ánchezEstructuras de Datos 03/10/11 3

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

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

M. Aldea, M. González, P. SánchezEstructuras 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ánchezEstructuras 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.

M. Aldea, M. González, P. SánchezEstructuras de Datos 03/10/11 6

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

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

M. Aldea, M. González, P. SánchezEstructuras 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ánchezEstructuras 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 puedeimplementar el TAD

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

M. Aldea, M. González, P. SánchezEstructuras de Datos 03/10/11 9

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

• ...

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

M. Aldea, M. González, P. SánchezEstructuras 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

...

...

78

8

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

M. Aldea, M. González, P. SánchezEstructuras 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 lineales2.1. Implementación mediante array

M. Aldea, M. González, P. SánchezEstructuras de Datos 03/10/11 12

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

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

M. Aldea, M. González, P. SánchezEstructuras 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 lineales2.1. Implementación mediante array

M. Aldea, M. González, P. SánchezEstructuras 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 constante O(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 lineales2.1. Implementación mediante array

M. Aldea, M. González, P. SánchezEstructuras de Datos 03/10/11 15

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

8c�16c

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

M. Aldea, M. González, P. SánchezEstructuras 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 lineales2.2. Recorrido de una secuencia: Iterador

M. Aldea, M. González, P. SánchezEstructuras 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 lineales2.2. Recorrido de una secuencia: Iterador

M. Aldea, M. González, P. SánchezEstructuras de Datos 03/10/11 18

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

3numEle

0iterador

a

hasNext()�truenext() �a[0]

13

2

hasNext()�truenext() �a[1]

hasNext()�truenext() �a[2]

hasNext()�false

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

M. Aldea, M. González, P. SánchezEstructuras 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 lineales2.3. Implementación mediante listas simplemente enlazadas

M. Aldea, M. González, P. SánchezEstructuras 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 lineales2.3. Implementación mediante listas simplemente enlazadas

M. Aldea, M. González, P. SánchezEstructuras de Datos 03/10/11 21

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

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

M. Aldea, M. González, P. SánchezEstructuras 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 lineales2.3. Implementación mediante listas simplemente enlazadas

M. Aldea, M. González, P. SánchezEstructuras 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 lineales2.3. Implementación mediante listas simplemente enlazadas

M. Aldea, M. González, P. SánchezEstructuras de Datos 03/10/11 24

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

CeldasCabecera

lista

principio

iterador

antUltRet previo

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

M. Aldea, M. González, P. SánchezEstructuras de Datos 03/10/11 25

Situación inicial del iterador

a1 a2 an...

CeldasCabecera

lista

principio

iterador

antUltRet previo

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

M. Aldea, M. González, P. SánchezEstructuras 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 lineales2.3. Implementación mediante listas simplemente enlazadas

M. Aldea, M. González, P. SánchezEstructuras de Datos 03/10/11 27

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 listay buscar el elemento anterior al previo

3) previous retorna b

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

M. Aldea, M. González, P. SánchezEstructuras 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 lineales2.3. Implementación mediante listas simplemente enlazadas

M. Aldea, M. González, P. SánchezEstructuras 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 borrariterador

antUltRet

previo

iterador

antUltRet

previo

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

M. Aldea, M. González, P. SánchezEstructuras de Datos 03/10/11 30

Diagrama de borra (después de previo)

a b c ...

1) antes de borrar

a b c ...

2) después de borrariterador

antUltRet

previo

iterador

antUltRet

previo

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

M. Aldea, M. González, P. SánchezEstructuras 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 usandonodos "falsos" (cabecera y cola)

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

M. Aldea, M. González, P. SánchezEstructuras 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 lineales2.4. Implementación mediante listas doblemente enlazadas

M. Aldea, M. González, P. SánchezEstructuras de Datos 03/10/11 33

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

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

M. Aldea, M. González, P. SánchezEstructuras 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 lineales2.4. Implementación mediante listas doblemente enlazadas

M. Aldea, M. González, P. SánchezEstructuras 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 lineales2.4. Implementación mediante listas doblemente enlazadas

M. Aldea, M. González, P. SánchezEstructuras de Datos 03/10/11 36

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

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

M. Aldea, M. González, P. SánchezEstructuras 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 lineales2.4. Implementación mediante listas doblemente enlazadas

M. Aldea, M. González, P. SánchezEstructuras 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 lineales2.4. Implementación mediante listas doblemente enlazadas

M. Aldea, M. González, P. SánchezEstructuras de Datos 03/10/11 39

Diagrama de borra (después de next)

b ...

iterador

1) situación inicial

2) después de borraultRet

proximo

iterador

ultRet

proximo

a c

b ...a c

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

M. Aldea, M. González, P. SánchezEstructuras de Datos 03/10/11 40

Diagrama de borra (después de previous)

b ...

iterador

1) situación inicial

2) después de borraultRet

proximo

iterador

ultRet

proximo

a c

b ...a c

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

M. Aldea, M. González, P. SánchezEstructuras 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/eliminarle2 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 lineales2.4. Implementación mediante listas doblemente enlazadas

M. Aldea, M. González, P. SánchezEstructuras de Datos 03/10/11 42

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

-Puede que tengamos que gestionar la liberación de memoria