Académique Documents
Professionnel Documents
Culture Documents
TDA. Introduccin
Introduccin
3
Abstraccin
programas El papel de los tipos de datos en el desarrollo de software Concepto de TDA: Tipo de dato abstracto Pasos a seguir para definir un TDA
en el desarrollo de
Concepto de abstraccin
4
Los programas son una combinacin de estructuras de datos y de algoritmos Las estructuras de datos sirven para almacenar temporalmente en memoria la informacin que precisa el programa Los algoritmos trabajan sobre las estructuras de datos procesando la informacin contenida en ellas La abstraccin procedimental permite usar algoritmos sin conocer detalle alguno sobre su implementacin La abstraccin de datos sirve para aislar al programador de los detalles sobre el almacenamiento de la informacin y la forma de operar sobre ella
Tipos de datos
5
El formato: La estructura de almacenamiento y ocupacin en memoria El dominio: Conjunto de valores posibles Los operadores: Conjunto de operaciones permitidas sobre valores del tipo
Los tipos de datos primitivos: enteros, caracteres, punto flotante, etc., son las abstracciones de datos con las que ya cuenta el lenguaje de programacin A partir de los tipos de datos primitivos se pueden crear otros: tipos agregados y tipos compuestos, para los que el lenguaje solamente cuenta con un soporte limitado, no ofreciendo, por ejemplo, operaciones sobre ellos
Al declarar una variable como int estamos usando un tipo primitivo con las siguientes caractersticas:
Formato: Almacenamiento en memoria dependiente del tipo de procesador: LSW-MSW y 32 64 bits Dominio: Variable segn la implementacin, para 32 bits valores entre (231) a 231 1 Operadores: Sobre valores enteros pueden aplicarse los operadores aritmticos, relacionales, de manipulacin de bits y de asignacin
El mecanismo de abstraccin de datos nos permite, por ejemplo, tomar dos variables enteras y realizar una suma sin que importe cul es el formato de almacenamiento interno ni el algoritmo especfico para llevar a cabo dicha operacin
Son colecciones de elementos pertenecientes a un tipo de dato primitivo En lenguaje C un tipo de dato agregado son los arrays o vectores, abstraccin de una sucesin homognea de valores del mismo tipo bsico Cada elemento de la coleccin es tratado como un valor del tipo base, conservando el mismo dominio, formato y operaciones Para el tipo agregado el lenguaje no suele ofrecer operaciones que permitan operar sobre l como un todo, como una coleccin En la biblioteca estndar de C para el tipo agregado char[] se ofrecen diversas operaciones: strlen(), strcpy(), strcmp(), etc. que no dejan de ser funciones externas, ya que el lenguaje no cuenta con soporte para tipos agregados, ni siquiera la operacin de asignacin
Se denomina as a los tipos compuestos de dos o ms partes que pueden ser de tipos primitivos, agregados u otros tipos compuestos En un tipo compuesto no hay una sucesin homognea de elementos del mismo tipo, cada parte tiene significado por s misma y tiene alguna clase de relacin con el resto Al igual que para los tipos agregados, la mayora de lenguajes no facilitan operaciones para actuar sobre tipos de datos compuestos En lenguaje C los tipos de datos compuestos, siempre que sus miembros sean de tipos primitivos, pueden ser asignados y comparados mediante los operadores estndar Un tipo agregado puede usar un tipo compuesto para sus elementos, un tipo compuesto puede tener como miembro un tipo agregado
Para realizar su trabajo un programa debe almacenar en memoria la informacin a procesar, usando para ello los tipos de datos ms adecuados a sus necesidades El uso de un tipo de dato inadecuado afecta de manera importante a la eficiencia de los algoritmos. Coleccin de datos con consultas frecuentes: vector? lista doblemente enlazada? rbol? La eleccin de un mal tipo de dato incluso puede provocar que ciertas operaciones sean imposibles: recorrido en sentido inverso de una lista no doblemente enlazada? Dependiendo de las necesidades de cada sistema ser necesario definir, apoyndose en tipos de datos primitivos, agregados y compuestos, las estructuras de datos que se precisen Cuanto mayor sea el grado de abstraccin de los tipos de datos que creemos mayor ser su utilidad y aplicacin en distintos sistemas
Conocidos habitualmente como TDA o ADT (Abstract Data Type), se definen como la combinacin de un tipo y un conjunto reglas (operaciones) aplicables sobre dicho tipo Cada una de las operaciones se define en funcin de las entradas que precisa y los resultados que genera La definicin de un TAD facilita lo elementos necesarios para su uso, sin aportar informacin alguna sobre cmo est implementado El diseo de un TAD se basa en el principio de ocultacin de informacin, encapsulando los detalles y ofreciendo al exterior nicamente una interfaz de acceso La generalizacin de las operaciones, sin que importe el tipo de dato concreto, es un mecanismo de abstraccin flexible y potente
TDA - Ejemplo
14
Un conjunto, en su acepcin matemtica, es un magnfico ejemplo de TDA El dominio de un conjunto (elementos que puede contener) puede ser definido como:
Las reglas que rigen los conjuntos estn definidas en operaciones como:
Diseo
lgico abstracto:
Declarar la estructura de datos que reflejar el formato definido anteriormente Declarar la signatura de cada una de las operaciones (sintaxis de invocacin)
Implementacin:
Detalles de representacin de la estructura de datos Codificacin de los algoritmos para cada una de las operaciones
La descomposicin en mdulos del cdigo facilita tanto el diseo de nuevos TDA como su utilizacin por parte del propio diseador o de terceros Por regla general todo TDA se dividir en dos mdulos:
Un archivo de cabecera (.h) conteniendo la especificacin: declaracin del tipo de dato y sus variantes y los prototipos de las funciones que actuarn como interfaz de acceso al TDA Un archivo de implementacin (.c/.cpp) en el que se ocultar la representacin del tipo de dato y la implementacin de las funciones
Para usar el TDA nicamente habr que incluir el archivo de cabecera con la especificacin (abstraccin: es todo lo que se necesita saber sobre el TDA) y agregar al proyecto la implementacin, ya sea el mdulo fuente o una versin ya compilada
Implementacin de operaciones
17
Los mtodos/funciones que actan sobre el TDA, representando las distintas operaciones posibles, deben:
Efectuar una comprobacin exhaustiva de las precondiciones Generar el efecto de la operacin nicamente si se satisfacen por completo Modificar exclusivamente los parmetros y el estado segn se indique en la documentacin Mayor robustez en los programas, al no obtener efectos inesperados al usar operaciones sin cumplir los requisitos necesarios Un tratamiento ms sencillo de los posibles errores, al estar documentados los efectos, precondiciones y parmetros afectados
Implementacin de operaciones
18
21
22
23
TDA lineales
TDA lineales
24
Objetivos Saber clasificar los TDA Pilas estticas y dinmicas Colas estticas y dinmicas Listas enlazadas estticas, simples y doblemente enlazadas
Segn cmo se gestione la memoria tenemos: TDA estticos: el tamao mximo est prefijado y no pueden crecer, ocupan un espacio contiguo en memoria TDA dinmicos: el tamao se va ajustando a medida que es necesario, ocupan bloques de memoria enlazados entre s Segn la estructura de los datos los TDA son: TDA lineales: vectores, listas, pilas, colas, colas de prioridad, etc. TDA no lineales: matrices, rboles binarios, rboles AVL, grafos, montculos, redes, etc. Otros TDA: conjuntos, tablas de dispersin, punto en el espacio, nmero complejo, etc.
TDA lineales
26
Muchos de los TDA lineales pueden disearse como un conjunto distinto de operaciones sobre dos implementaciones bsicas: vectores o listas Las pilas, las colas, colas circulares y colas de prioridad se pueden enfocar como listas/vectores con un orden particular a la hora de insertar o extraer datos Todos los TDA lineales pueden implementarse de manera esttica o dinmica. Segn el nmero de elementos que se prevea que pueden contener interesar ms una opcin u otra Tambin las operaciones a contemplar influirn en esta decisin, ya que ciertas operaciones resultan ms complejas cuando la asignacin es exclusivamente esttica
TDA lineales
27
Listas: Secuencias de elementos sin un orden concreto en las operaciones de insercin y extraccin Pilas: Listas en las que los elementos se introducen y extraen siempre por el mismo extremo Colas: Listas en las que los elementos se introducen por un extremo y se extraen por el opuesto
Salvo por el orden en que se efectan la insercin y extraccin de elementos, estas estructuras de datos comparten muchas caractersticas comunes y, en consecuencia, su implementacin tambin Para cada caso trataremos su implementacin esttica y tambin dinmica
TDA Pila
28
Palabra original: arboleda Palabra invertida: adelobra Finalmente se comparan: if(original == invertida) // La palabra es un palndromo
TDA Pila
29
Conceptos generales
Una pila es una lista de tipo LIFO en la que las operaciones de insercin y extraccin actan de la siguiente manera:
Insercin: Cada nuevo valor se dispone en el tope de la pila, sobre todos los que haya almacenados previamente Extraccin: nicamente se puede recuperar el valor que est en el tope de la pila. Al retirarlo se obtiene acceso al que est debajo
Usualmente adems de estas dos operaciones tambin se facilita una para comprobar si la pila est vaca o no y tambin otra para inspeccionar el valor que hay en el tope de la pila sin llegar a extraerlo Como las dems estructuras de datos lineales, las pilas pueden ser implementadas de manera esttica o de manera dinmica
TDA Pila
30
Implementacin
esttica
TDA Pila
31
Implementacin
TDA Pila
32
Implementacin
esttica Especificacin de
operaciones
TDA Pila
33
Implementacin
esttica pila.h
TDA Pila
34
Implementacin
esttica pila.cpp
TDA Pila
35
Implementacin
esttica pila.cpp
TDA Pila
36
Implementacin
esttica pila.cpp
TDA Pila
37
Implementacin
TDA Pila
38
Implementacin
dinmica
TDA Pila
39
Implementacin
TDA Pila
40
Implementacin
dinmica pila.h
TDA Pila
41
Implementacin
dinmica pila.cpp
TDA Pila
42
Implementacin
dinmica pila.cpp
TDA Pila
43
Implementacin
dinmica pila.cpp
TDA Cola
44
Conceptos generales Una cola es una lista de tipo FIFO en la que las operaciones de insercin y extraccin actan de la siguiente manera:
Insercin: Cada nuevo valor se dispone al final de la cola, detrs de todos los elementos que haya almacenados previamente Extraccin: nicamente se puede recuperar el valor que al inicio de la cola. Al retirarlo se obtiene acceso al siguiente
Usualmente adems de estas dos operaciones tambin se facilita una para comprobar si la cola est vaca o no y tambin otra para inspeccionar el valor que hay en el inicio de la cola sin llegar a extraerlo Como las dems estructuras de datos lineales, las colas pueden ser implementadas de manera esttica o de manera dinmica
TDA Cola
45
Especificacin
de operaciones
TDA Cola
46
Implementacin esttica A diferencia de una pila, implementar una cola mediante un vector esttico no resulta eficiente. Cul es la eficiencia de las dos operaciones fundamentales?:
Insertar un elemento al final: Basta con agregarlo y ajustar el contador de elementos usados en el vector. Puede realizarse en tiempo constante Retirar un elemento del inicio: Al quitar el primer elemento del vector, sera necesario desplazar todos los que hay detrs y finalmente ajustar el contador de elementos usados. Requerira un tiempo lineal en cada llamada.
Es posible obtener una mejora en la eficiencia de las operaciones sin cambiar la estructura de datos (el vector) por otra distinta?
TDA Cola
47
TDA Cola
48
Implementacin esttica Para insertar un elemento en la cola se incrementa el contador de usados, lo que equivale a moverse una posicin en el sentido de las agujas del reloj, y se escribe el elemento en esa posicin Para suprimir un elemento simplemente se incrementa el ndice que apunta al primer elemento, lo que equivaldra tambin a moverse una posicin en el mismo sentido De esta forma, la cola se mueve en crculos conforme se insertan y suprimen elementos, evitando tener que desplazarlos con cada extraccin Utilizando este modelo las funciones de insercin y extraccin se pueden implementar de manera que su ejecucin se realice siempre en tiempo constante
TDA Cola
49
Implementacin
esttica cola.h
TDA Cola
50
Implementacin
esttica cola.cpp
TDA Cola
51
Implementacin
esttica cola.cpp
TDA Cola
52
Implementacin
esttica cola.cpp
TDA Cola
53
Implementacin
dinmica
TDA Cola
54
Implementacin
TDA Cola
55
Implementacin
dinmica - Cola.h
TDA Cola
56
Implementacin
dinmica - Cola.cpp
TDA Cola
57
Implementacin
dinmica - Cola.cpp
TDA Cola
58
Implementacin
dinmica - Cola.cpp
TDA Cola
59
Implementacin
dinmica - Cola.cpp
TDA Cola
60
Implementacin
dinmica - Cola.cpp
TDA Lista
61
Conceptos generales
La lista es el TDA subyacente que permite construir otros muchos TDA, entre ellos las pilas y las colas. En contraposicin a stos, los mtodos de insercin y extraccin de elementos no tienen restricciones:
Insercin: En una lista los nuevos elementos pueden agregarse al final, al principio o entre cualesquiera otros dos elementos ya existentes Extraccin: Es posible eliminar cualquier elemento de la lista: el primero, el ltimo o uno intermedio. La lista se recompone con cada borrado
Adems de estas dos operaciones en las listas tambin se precisan otras para saber si la lista est o no vaca, obtener el nmero de elementos total que contiene, facilitar la enumeracin de los elementos, etc. Tambin es usual contar con operaciones que permitan concatenar dos listas en una, dividir una lista en dos o ms sublistas, comprobar si una lista est contenida en otra y similares
TDA Lista
62
Especificacin
de operaciones
TDA Lista
63
Implementacin esttica Al contar con operaciones muy diversas, que actan en diferentes posiciones, la eficiencia de las operaciones con una implementacin esttica es variable:
Insertar y eliminar elementos al final: Se puede realizar en tiempo constante Insertar y eliminar elementos al inicio: Requerira un desplazamiento de todos los elementos ya existentes, pero con ciertas tcnicas se puede conseguir hacerlo en tiempo constante Insertar y eliminar elementos en posiciones intermedias: Precisa un desplazamiento de los elementos ya existentes en la lista, por lo que la eficiencia es lineal Acceso directo a un elemento cualquiera: Se efecta en tiempo constante Unir/Dividir listas: Normalmente requiere recorrer al completo una de la listas y parcialmente otra, por lo que al menos se requiere un tiempo lineal
TDA Lista
64
Implementacin
TDA Lista
65
Implementacin
TDA Lista
66
Implementacin dinmica Se efecta como una lista de nodos enlazados de manera simple: cada nodo apunta al siguiente, o doble: cada nodo tiene un puntero al anterior y al siguiente. Las operaciones tienen las siguientes consideraciones:
Insertar y eliminar elementos al final: Se puede realizar en tiempo constante si en la cabecera se tiene un puntero al ltimo elemento Insertar y eliminar elementos al inicio: Se puede realizar en tiempo constante Insertar y eliminar elementos en posiciones intermedias: Una vez se tiene el puntero al elemento, la insercin o eliminacin se hacen en tiempo constante Acceso directo a un elemento cualquiera: Requiere recorrer la lista desde el principio saltando el nmero de nodos indicados, por lo que su eficiencia es lineal Unir/Dividir listas: Son operaciones que pueden realizarse en tiempo constante una vez se tienen los puntos a los elementos extremos
TDA Lista
67
Implementacin
TDA Lista
68
Implementacin
TDA Lista
69
Implementacin
dinmica Insercin de un
elemento
TDA Lista
70
Implementacin
dinmica Insercin de un
elemento
75
TDA no lineales
Tipos
de rboles y conceptos bsicos Implementacin del TDA rbol binario Introduccin a las tablas de dispersin Dispersin abierta y cerrada
rboles
77
Conceptos Un rbol es un conjunto finito de elementos, a los que se llama nodos, de los cuales uno acta como raz y del que cuelgan los nodos hijo. stos se definen de igual forma recursivamente hasta llegar a los nodos hoja, sin hijos
rboles
78
Profundidad de un nodo: Distancia en nodos hasta la raz Altura de un nodo: Distancia mxima en nodos hasta una de sus hojas Altura del rbol: Altura del nodo raz Nivel: Conjunto de nodos de igual profundidad Padre: Nodo del nivel superior al que se encuentra conectado un nodo dado Nodos hermanos: Los nodos del mismo nivel rbol lleno: Todos sus niveles tienen ordeni nodos, con i=nivel
rboles
79
Conceptos Descendientes: Conjunto de nodos hijos de los hijos de un nodo dado Ascendientes: Nodos padre, abuelo, etc., de un nodo dado rbol en inorden: Todos los nodos del subrbol de la izquierda son menores que la raz y todos los de la derecha son mayores (izq<raz<der) rbol en preorden: La raz es menor que todos los nodos del subrbol de la izquierda, siendo estos menores que los del subrbol de la derecha (raz<izq<der) rbol en postorden: La raz es mayor que todos los nodos del subrbol de la derecha, siendo estos mayores que los del subrbol de la izquierda (izq<der<raz)
rboles
80
Conceptos
rboles
81
Conceptos
Tipos de rboles
82
rbol
general: Puede tener cualquier orden (nmero de hijos por nodo) rbol binario: rbol de orden dos (cada nodo tendr 0, 1 2 hijos) rbol de bsqueda: rbol binario en inorden rbol AVL: rbol equilibrado en altura (garantiza orden logartmico de las operaciones) Heap: rbol con orden parcial (el padre es menor que sus hijos, pero no hay restricciones entre stos) Otros rboles: rboles B (ndices en BDD, compresin), rboles Rojo-Negro (rbol de bsqueda equilibrado), rboles Splay (acceso optimizado a nodos recientes), etc.
rboles binarios
84
Un rbol binario es aqul en el que ningn nodo puede tener ms de dos hijos Se define como un nodo raz que puede tener 0, 1 2 hijos, definindose stos de forma recursiva como subrboles que cuelgan de la raz Se conoce al nodo de la izquierda como hijo izquierdo y al de la derecha como hijo derecho Por su propia naturaleza los rboles binarios son estructuras de datos recursivas y las operaciones se implementan segn esta tcnica Un rbol binario puede dividirse en tres subconjuntos disjuntos:
{R} Nodo raz {I1, I2, ..., In} Subrbol izquierdo de R {D1, D2, ..., Dn} Subrbol derecho de R
rboles binarios
85
Equilibrado
rboles binarios
86
Representacin
Especificacin
de operaciones
arbolbinario.h
arbolbinario.cpp
arbolbinario.cpp
arbolbinario.cpp
arbolbinario.cpp
arbolbinario.cpp
Ejemplo
de uso
Ejemplo
de uso
96
Tablas de dispersin
1.- Tablas de dispersin 2.- Funciones de dispersin 3.- Tipos de dispersin
3.1- Dispersin abierta 3.2.- Dispersin cerrada 3.3.- Dispersin doble
Tablas de dispersin
97
Tablas de dispersin
98
Conceptos Se trata de encontrar una funcin f(x) que asigne a cada dato, ya sea ste numrico o alfanumrico, una posicin distinta Cuando se asigna a dos datos diferentes una misma posicin se habla de colisiones, que es necesario resolver El objetivo es que el nmero de colisiones sea igual a cero, para lo cual se depende de dos parmetros: el tamao del almacenamiento y la funcin de dispersin (lo buena que sea sta) Al mismo tiempo hay que reducir la cantidad de espacio sin usar Objetivos:
Tablas de dispersin
99
Funciones de dispersin La funcin ha de ser determinista: para el mismo valor ha de facilitar siempre la misma posicin Para claves numricas (T es el tamao de la tabla, primo):
Por divisin: f(x) = x mod T Por producto: f(x) = ent(T*frac(x*C)) / C (0,1)
Para
claves alfanumricas:
Operar sobre los cdigos de todos los caracteres o parte de ellos. Lo ms fcil: sumar los cdigos Asignar un peso a las posiciones mejora la dispersin
Funciones de dispersin
100
Ejemplos
Tipos de dispersin
101
Dispersin cerrada:
Se opera sobre un vector de tamao fijo Existe un lmite en el nmero de datos que pueden almacenarse La resolucin de colisiones tratar de recolocar los datos en elementos libres del vector Se opera sobre un vector de listas enlazadas No existe un lmite en el nmero de datos que pueden almacenarse La resolucin de colisiones acta sobre las listas enlazadas Clculo del factor de carga [0,1] - Hay que maximizarlo Conteo del nmero de colisiones - Hay que minimizarlo
Dispersin abierta:
Anlisis de eficiencia:
Dispersin abierta
102
Vector de punteros a listas enlazadas Si el tamao del vector es adecuado eficiencia cercana a O(1) Insercin:
Posicin f(dato) Insercin al inicio de la lista Posicin f(dato) Bsqueda secuencial en la lista Posicin f(dato) Bsqueda secuencial y borrado
Consulta:
Borrado:
Dispersin cerrada
103
Vector con tamao fijo, no puede crecer, por lo que ha de dimensionarse correctamente Si el factor de carga es alto la probabilidad de colisiones se incrementa Exploracin lineal:
Posicin (f(dato) + intento) % T Se parte de intento=0 y se va incrementando si est ocupada Posicin (f(dato) + intento2) % T Consigue mayor dispersin Posicin (f1(dato) + intento * f2(dato)) % T Se aplica una segunda funcin de dispersin si el primer intento falla
Exploracin cuadrtica:
Dispersin doble:
Dispersin doble
104
El
uso de la tcnica de dispersin doble contribuye a mejorar la distribucin de los datos en la tabla Para claves numricas
Se aplican dos funciones de tipo multiplicativo, empleando en cada una de ellas una constante distinta
Para claves alfanumricas Se aplican dos funciones por divisin sobre los caracteres de la clave, una en su orden original y otra en orden inverso:
f1("clave") f2("evalc")
Cuando se conozca de antemano el nmero mximo de elementos que se necesitar almacenar y, adems, no sea habitual la eliminacin El borrado de datos con dispersin cerrada no es trivial, al eliminar un dato deja un hueco que romper la secuencia de bsqueda, ya sea esta lineal, cuadrtica o doble Posibles soluciones a la eliminacin de datos:
Utilizar un borrado perezoso: marcar las posiciones como libres Realizar una redispersin de los datos tras ajustar su tamao Combinar la redispersin y el borrado perezoso
Por regla general la dispersin abierta, con el ajuste apropiado del vector de punteros, permitir obtener una mejor eficiencia en las operaciones
Bibliografa
106
Algoritmos
Estructuras