Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Tdas
Tdas
Tipos Abstractos
de Datos
o Definiciones
o TAD String
o Concepto de contenedor
o Colecciones e Iteradores
o Relaciones entre elementos
o TAD's contenedores
Conjunto de valores
.. que pertenecen al Tipo de Datos TAD
Enumerados o construidos sintácticamente
César Vaca Rodríguez, Dpto. de Informática, UVa 2
Concepto de tipo abstracto de datos (TAD)
Objetivo:
Separar interfaz (definición operaciones) de implementación
(representación de los datos + algoritmos de las operaciones).
Notación:
El estado de un TAD viene dado por la secuencia de operaciones
realizadas sobre él.
La definición de las operaciones suele darse mediante axiomas y
reglas lógicas.
César Vaca Rodríguez, Dpto. de Informática, UVa 3
Ejemplo de definición de PILA
Definición axiomática (TAD) Definición por código (no TAD)
ESPECIFICACIÓN PILA type
PNodo = ^TNodo;
TAD pila[elemento] TPila = PNodo;
OPERACIONES TNodo = record
Dato : ...;
• crear : pila Sig : TPila
• esta_vacía : pila booleano end;
• cima : pila elemento function cima(P: TPila) : PNodo;
• apilar : pila, elemento pila begin
• desapilar : pila pila Result := P
PRECONDICIONES end;
• cima(p) ¬ esta_vacía(p) procedure apilar(var P: TPila;
• desapilar(p) ¬ esta_vacía(p) X: PNodo);
begin
ECUACIONES X^.Sig := P; P := X
• esta_vacía( crear ) == T end;
• esta_vacía( apilar(p, x) ) == F procedure desapilar(var P: TPila);
• cima( apilar(p, x) ) == x begin
P := P^.Sig
• desapilar( apilar(p, x) ) == p
end; 4
FIN_ESPECIFICACIÓN
Definición (TADs)
Interfaz (Java)
public interface Pila<E>
{
boolean estaVacia();
E cima();
void apilar(E elem);
void desapilar();
}
César Vaca Rodríguez, Dpto. de Informática, UVa 5
Implementación (Java)
public class PilaArray<E> implements Pila<E>
{
private E[] vec;
private int tam;
public PilaArray() {
vec = (E[]) new Object[100];
tam = 0;
}
boolean estaVacia() { return tam == 0; }
E cima() { return vec[tam-1]; }
void apilar(E elem) {
if(tam == vec.length) {
Object[] tmp = new Object[2*tam];
System.arraycopy(vec,0,tmp,0,tam-1);
vec = (E[]) tmp;
}
vec[tam++] = elem;
}
void desapilar() { return vec[--tam]; }
}
César Vaca Rodríguez, Dpto. de Informática, UVa 6
Implementación (Haskell)
instance Pila (MiPila a) where
estaVacia PVacia = True
estaVacia _ = False
cima (PNodo x _) = x
apilar p x = PNodo x p
desapilar (PNodo x p) = p
César Vaca Rodríguez, Dpto. de Informática, UVa 7
TAD Cadena de caracteres (STRING)
Secuencia ordenada de símbolos (caracteres) definidos por un
determinado alfabeto
César Vaca Rodríguez, Dpto. de Informática, UVa 9
Operaciones básicas del TAD STRING (II)
MUTABLES e INMUTABLES (sigue):
Es posible mejorar la eficiencia de la búsqueda de una subcadena usando
representaciones más sofisticadas que el vector de caracteres. En
particular, usando árboles de sufijos es posible obtener un tiempo (m)
(independiente del tamaño del texto donde se busca).
Concatenación: En inmutables, devolver la cadena concatenada. En
mutables, extender la cadena con la otra. Usando listas enlazadas
circulares o ropes es posible realizar ésta operación en O(1).
Obtención de la subcadena que se encuentra en una determinada posición
y longitud.
Acceso al carácter i‐ésimo.
MUTABLES sólo:
Inserción de subcadena en una determinada posición.
Borrado de un bloque contiguo de la cadena.
Modificación del carácter i‐ésimo.
César Vaca Rodríguez, Dpto. de Informática, UVa
1
0
Contenedores
TADs contenedores:
Almacenan información sobre varios elementos.
No tienen porqué almacenar “físicamente” a los elementos: pueden
almacenar referencias a ellos y/o información sobre relaciones entre
ellos. Además, es común que los elementos sean "compartidos" por varias
estructuras.
Criterios de clasificación:
Los elementos se pueden considerar atómicos o divididos en partes
relevantes.
Puede imponerse requisitos sobre los elementos o alguna parte de ellos:
Equivalencia: Poder saber si dos elementos son iguales.
Comparación: Poder saber si un elemento es mayor o menor que otro.
Puede permitirse elementos repetidos o no.
Puede existir una relación (o no) entre los elementos.
Si existe relación de orden, ésta puede ser externa (decidida por quien
usa la estructura) o interna (determinada por los valores de los
elementos)
César Vaca Rodríguez, Dpto. de Informática, UVa 11
Clasificación de los contenedores básicos
Contenedores con elementos atómicos:
Contenedor Relación Orden Rep Req
Conjunto Ninguna Azar No =
Lista (indexada) Precedencia Externo Si
Pila Precedencia Externo Si
Cola Precedencia Externo Si
Bicola Precedencia Externo Si
Lista ordenada Precedencia Interno Si
Cola de prioridad Precedencia Interno Si
César Vaca Rodríguez, Dpto. de Informática, UVa 12
Implementación de contenedores
La inmensa mayoria de las representaciones de contenedores tan sólo
hacen uso de los siguientes elementos básicos de construcción (presentes
o definibles en prácticamente todos los lenguajes imperativos):
Arrays
Referencias a elementos:
Punteros a variables dinámicas
Referencias a objetos
Índices a la posición donde se encuentra en un array
Nombre del fichero y posición dentro de éste en que se encuentra
Funciones resumen ó dispersión (hash functions):
Una función que traduce el valor de un elemento a un número,
tipicamente en el rango de los enteros de la máquina.
No es necesario (ni posible en la mayoría de los casos) que a cada valor de
un elemento se le asigne un número distinto.
Para ser útiles deben cumplir una serie de requisitos.
César Vaca Rodríguez, Dpto. de Informática, UVa 13
Colecciones e Iteradores (I)
Actualmente existe una tendencia a organizar las librerias de clases
bajo los conceptos de Colección (Collection) e Iterador (Iterator).
Ejemplo: Java, Python, C#, Eiffel, .NET. Existen lenguajes que
añaden un tipo adicional de bucle, el bucle controlado por iterador.
Una colección es una fuente de datos (estructura de datos, fichero,
conexión de red, etc.) de la cual se puede obtener un iterador para
acceder a sus datos.
Un iterador es un mecanismo que permite acceder a un elemento
(el elemento actual) y pasar al siguiente (dependiendo del tipo de
iterador es posible que se permitan más operaciones).
Tipicamente el concepto de colección se representa mediante una
clase abstracta o interfaz de la que heredan/implementan aquellas
clases que pueden servir de fuente de datos.
César Vaca Rodríguez, Dpto. de Informática, UVa 14
Colecciones e Iteradores (II)
El iterador se representa por una clase/interfaz con las operaciones
de acceso y paso al siguiente. Suelen existir clases iteradoras con
más operaciones disponibles, que heredan del iterador general.
El objetivo es proporcionar un mecanismo uniforme de acceso a
cualquier fuente de datos (colección).
Las operaciones básicas de un iterador son:
Comprobar si quedan más elementos por recorrer
Acceder al elemento actual
Pasar al elemento siguiente
Borrar el elemento actual
César Vaca Rodríguez, Dpto. de Informática, UVa 15
Contenedores principales ‐ Conjunto
Colección de valores sin un orden definido en la que no se
permiten elementos repetidos
Los conjuntos se utilizan para clasificar valores en dos categorías: Los que
pertenecen al conjunto y los que no pertenecen a él.
Las operaciones básicas son:
Pertenencia: Comprobar si un valor pertenece al conjunto.
Inclusión: Hacer que un valor pertenezca al conjunto.
Exclusión: Hacer que un valor no pertenezca al conjunto.
También pueden ser importantes las operaciones de combinación de conjuntos:
unión, intersección, diferencia.
El recorrido de los elementos de un conjunto no garantiza ningún orden en
particular.
Existen muchas posibilidades respecto a la implementación:
Arrays de bits indexados por valor.
Tablas de dispersión (Hash tables)
Contigua lineal (arrays de valores), ya sea desordenados u ordenados.
Árboles binarios equilibrados (Árboles AVL, Red‐Black Trees, etc.)
Opciones exóticas: Tries, Bloom filter, Van Emde Boas Tree.
César Vaca Rodríguez, Dpto. de Informática, UVa 16
Contenedores principales ‐ Lista
Colección ordenada de entidades
A diferencia de los conjuntos, en las listas existe una relación de orden
impuesta a los elementos, y se permiten elementos repetidos. Si el orden
es interno hablamos de Listas ordenadas.
El orden permite asociar los elementos con un conjunto de índices.
Existen muchas variantes que difieren en las restricciones que
impongamos a las operaciones de acceso, inserción y borrado:
Los iteradores de lista permiten señalar un elemento ó posición en la lista
(cursor), en base al cual se realizan todas las operaciones. Tambien se permite
cambiar el cursor (pasar a siguiente y/o anterior).
Las listas indexadas permiten realizar las operaciones indicando el índice del
elemento.
Las pilas, colas y bicolas sólo permiten realizar operaciones sobre los
elementos extremos.
En las listas ordenadas el elemento con índice i es el i‐ésimo menor.
Las colas de prioridad son un caso especial de lista ordenada en que las
operaciones se restringen a un extremo (el elem. mínimo o máximo)
César Vaca Rodríguez, Dpto. de Informática, UVa
17
Contenedores principales ‐ Lista
IMPLEMENTACIONES
Listas (orden externo): Listas indexadas, secuenciales, pilas, colas,
bicolas. Dependiendo de la variante concreta, y de las operaciones más
relevantes para el problema, se usarán alguna de las siguientes
implementaciones:
Contigua lineal, contigua circular (arrays)
Listas enlazadas (lineales|circulares, simples|dobles)
Listas ordenadas (orden interno)
Contigua lineal ordenada (arrays)
Árboles binarios de búsqueda (ABB)
ABB equilibrados (Árboles AVL, Árboles B, Red‐Black Trees, ..)
Otras opciones: Skip Lists, Splay Trees
Colas de prioridad
Montículos binarios (binary heap)
Otros montículos: Binomiales, Fibonacci
Treaps
César Vaca Rodríguez, Dpto. de Informática, UVa 18
Contenedores principales ‐ Mapa
TAD compuesto por un conjunto de claves y una colección de
valores donde cada clave tiene asociado un valor
César Vaca Rodríguez, Dpto. de Informática, UVa 19
Contenedores principales ‐ Diccionario
Un Diccionario es un Mapa donde se define un orden interno
sobre las claves (forman una lista ordenada)
César Vaca Rodríguez, Dpto. de Informática, UVa 20
Relación de precedencia u orden
1 2 n
x …
primero predecesor(x) sucesor(x) último
raiz
Los elementos se relacionan con una
estructura jerárquica (tipo arbol)
padre de x Hay un elemento distinguido, el raiz, y los
demas se particionan en subárboles, y así
recursivamente.
Cada elemento (excepto el raiz) tiene un padre
x
(superior) y cero o más hijos (subordinados).
Permite representar elementos con una
estructura jerárquica (más compleja y flexible
hijos de x que la relación de orden).
A diferencia de la relación de orden, no existe
una única forma distinguida de recorrer los
elementos, sino varias: preorden, inorden,
postorden y por niveles.
Si se impone un orden interno la relación
puede servir como una representación
(montículos, arboles binarios de búsqueda,
etc.) útil para varios TADs
César Vaca Rodríguez, Dpto. de Informática, UVa 22
Relación de vecindad (grafo)
vecinos de x
No existen restricciones respecto a la forma de
relacionar unos elementos con otros.
Cada elemento puede estar relacionado con 0 o
más elementos, sus vecinos.
x
No existe nigún elemento distinguido.
No hay recorridos distinguidos, tan sólo la
posibilidad de elegir un nodo y recorrer en
profundidad o en anchura.
Las relaciones entre elementos pueden ser (o
no) direccionales y suelen llevar información
asociada.
César Vaca Rodríguez, Dpto. de Informática, UVa 23
Clasificación operaciones básicas
• Pertenencia
Elemento
• Recuento
por Valor
• Dato asociado
Clave
• Lista elementos
asociados a clave
Acceso Índice Resultado del
• Cabeza acceso
ó por Posición Extremo
• Cola
Borrado Iterador de lista
i‐ésimo Menor
por Orden • Mínimo
Extremo
• Máximo
i-ésimo Menor
Recorrido
por Orden • Mínimo
Extremo
• Máximo
• en Cabeza
Inserción Extremo
• en Cola
en Posición Índice
• antes
Cursor
• después
César Vaca Rodríguez, Dpto. de Informática, UVa 25
Mapa (Associative array, Lookup table, Map, Index)
• Pertenencia
Elemento Sin relación
• Recuento
por Valor Elementos son pares
• Dato asociado
Clave clave - dato
• Lista elementos
asociados a clave Req: Equivalencia claves
Acceso Índice
Sin claves repetidas
• Cabeza
ó por Posición Extremo
• Cola Otras operaciones:
Borrado Iterador de lista
Modificar dato
i-ésimo Menor
por Orden Usos:
• Mínimo
Extremo
• Máximo Lenguajes Awk, Perl,
JavaScript, PHP
• en Cabeza
Inserción Extremo
• en Cola
en Posición Índice
• antes
Cursor
• después
César Vaca Rodríguez, Dpto. de Informática, UVa 26
Lista indexada (List)
• Pertenencia
Elemento Relación Orden Externo
• Recuento
por Valor Elementos atómicos
• Dato asociado
Clave
• Lista elementos Req: Ninguno
asociados a clave
Elementos repetidos
Acceso Índice
• Cabeza
ó por Posición Extremo
• Cola
Otras operaciones:
i-ésimo Menor
Recorrido
por Orden • Mínimo Búsqueda
Extremo
• Máximo
Ordenación
• en Cabeza
Inserción Extremo
• en Cola
en Posición Índice Iterador de lista
• antes
Cursor
•• después
después
César Vaca Rodríguez, Dpto. de Informática, UVa 27
Pila (Stack)
• Pertenencia
Elemento Relación Orden Externo
• Recuento
por Valor Elementos atómicos
• Dato asociado
Clave
• Lista elementos Req: Ninguno
asociados a clave
Elementos repetidos
Acceso Índice
• Cabeza
ó por Posición Extremo
• Cola
Estructura LIFO (Last In,
First Out)
Borrado Iterador de lista
Usos:
i-ésimo Menor
por Orden Gestión memoria
• Mínimo
Extremo Recursivo Iterativo
• Máximo
Traducción expr.
matemáticas
según Valor (sin argumentos)
Lenguages FORTH,
• en Cabeza
Inserción Extremo
• en Cola
Postscript, Java VM
en Posición Índice
• antes
Cursor
• después
César Vaca Rodríguez, Dpto. de Informática, UVa
28
Cola (Queue)
• Pertenencia
Elemento Relación Orden Externo
• Recuento
por Valor Elementos atómicos
• Dato asociado
Clave
• Lista elementos Req: Ninguno
asociados a clave
Elementos repetidos
Acceso Índice
• Cabeza
ó por Posición Extremo
• Cola
Estructura FIFO (First In,
First Out)
Borrado Iterador de lista
Usos:
i-ésimo Menor
por Orden Buffers
• Mínimo
Extremo Algoritmos recorrido
• Máximo
en anchura en árboles
y grafos.
según Valor (sin argumentos)
• en Cabeza
Inserción Extremo
• en Cola
en Posición Índice
• antes
Cursor
• después
César Vaca Rodríguez, Dpto. de Informática, UVa 29
Bicola (Deque)
• Pertenencia
Elemento Relación Orden Externo
• Recuento
por Valor Elementos atómicos
• Dato asociado
Clave
• Lista elementos Req: Ninguno
asociados a clave
Elementos repetidos
Acceso Índice
• Cabeza
ó por Posición Extremo
• Cola
Usos:
• en Cabeza
Inserción Extremo
• en Cola
en Posición Índice
• antes
Cursor
• después
César Vaca Rodríguez, Dpto. de Informática, UVa 30
Lista ordenada (Sorted List)
• Pertenencia
Elemento Relación Orden Interno
• Recuento
por Valor Elementos atómicos
• Dato asociado
Clave
• Lista elementos Req: Comparación
asociados a clave
Elementos repetidos
Acceso Índice
• Cabeza
ó por Posición Extremo
• Cola
Otras operaciones:
i-ésimo Menor
Recorrido
por Orden • Mínimo Búsqueda
Extremo
• Máximo
• en Cabeza
Inserción Extremo
• en Cola
en Posición Índice
• antes
Cursor
• después
César Vaca Rodríguez, Dpto. de Informática, UVa 31
Cola de prioridad (Priority queue)
• Pertenencia
Elemento Relación Orden Interno
• Recuento
por Valor Elementos son pares
• Dato asociado
Clave prioridad - dato
• Lista elementos
asociados a clave Req: Comparación
Acceso Índice
Variante: Cola de
• Cabeza
ó por Posición Extremo
• Cola
prioridad de máximos
Borrado Iterador de lista Otras operaciones:
i-ésimo Menor Modificar prioridad
por Orden • Mínimo
Extremo Fusión
• Máximo
Usos:
César Vaca Rodríguez, Dpto. de Informática, UVa 32
Diccionario (Map, Dictionary)
• Pertenencia
Elemento Mapa + Orden Interno en
• Recuento
por Valor claves
• Dato asociado
Clave Elementos son pares
• Lista elementos
asociados a clave
clave - dato
• en Cabeza
Inserción Extremo
• en Cola
en Posición Índice
• antes
Cursor
• después
César Vaca Rodríguez, Dpto. de Informática, UVa 33
Directorio (General Tree, Directory)
Un directorio representa una colección de
elementos con una relación de jerarquía entre
ellos. Ejemplo típico: Sistema de ficheros (SF).
César Vaca Rodríguez, Dpto. de Informática, UVa 34
Grafo (Graph)
Un grafo representa una colección de elementos
(vértices) sobre los que existe una relación de
vecindad definida por un conjunto de aristas.
Matriz de adyacencia
César Vaca Rodríguez, Dpto. de Informática, UVa 35
Otros TADs (I)
TAD MultiConjunto (Bag, Multiset): Un conjunto en el que se permiten
elementos repetidos.
La operación de acceso (pertenencia) devuelve un valor entero (en vez de un
booleano), el número de veces que aparece ese valor en el multiconjunto.
César Vaca Rodríguez, Dpto. de Informática, UVa 36
Otros TADs (II)
TAD Array ó TAD Vector: Operaciones de acceso por indice y reemplazar
elemento (también por indice).
César Vaca Rodríguez, Dpto. de Informática, UVa 37
Collections en Java
Collection HashSet
LinkedHashSet
Set
EnumSet
SortedSet
TreeSet
NavigableSet
ArrayList
List
Stack
Queue
PriorityQueue
DQueue
ArrayDQueue
LinkedList
César Vaca Rodríguez, Dpto. de Informática, UVa 38
Collections en Java
César Vaca Rodríguez, Dpto. de Informática, UVa 39
Collections en Java
HashMap
Map LinkedHashMap
EnumMap
SortedMap
NavigableMap TreeMap
César Vaca Rodríguez, Dpto. de Informática, UVa 40
Collections en Java
Iterator ListIterator
Collections (static)
+ hasNext() + add(elem)
+ binarySearch(lista, elem, comp) + next() + set(elem)
+ indexOfSublist(lista1, lista2) + remove() + hasPrevious()
+ min(colección, comp) + previous()
+ max(colección, comp)
+ reverse(lista)
+ rotate(lista, dis) Comparator
+ shuffle(lista)
+ sort(lista, comp) + compare(elem1, elem2)
+ equals(elem)
César Vaca Rodríguez, Dpto. de Informática, UVa 41
C++ Standard Template Library (STL)
• Sequences
• Associative containers
Sorted Hashed
Simple Múltiple Simple Múltiple
César Vaca Rodríguez, Dpto. de Informática, UVa 42