estructuras de datos - ocw.unican.es · estructuras de datos 03/10/11 1 estructuras de datos tema...
Post on 12-Oct-2018
230 Views
Preview:
TRANSCRIPT
. .
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
top related