2. Listas
Estructura de datos organizada de forma secuencial,
homogénea y dinámica. Con dinámica nos referimos
que puede crecer o decrecer en tiempo de ejecución
según nuestras necesidades.
Podríamos mencionar 2 tipos de listas:
Densa: la propia estructura determina cual es el
siguiente elemento de la lista. Ejemplo: arrays.
Enlazadas: la posición del siguiente elemento de la
estructura la determina el elemento actual.
3. Doblemente enlazada: al igual que la lista enlazada,
es un TDA dinámico lineal pero, a diferencia de este,
cada nodo de la lista doblemente enlazada contiene
dos punteros, de forma que uno apunta al siguiente
nodo y el otro al predecesor. Esta característica,
permite que se pueda recorrer la lista en ambos
sentidos, cosa que no es posible en las listas simples.
4. La lista enlazada es un TDA que nos permite
almacenar datos de una forma organizada, al igual que
los vectores pero, a diferencia de estos, esta estructura
es dinámica, por lo que no tenemos que saber "a
prioridad" los elementos que puede contener.
En una lista enlazada, cada elemento apunta al
siguiente excepto el último que no tiene sucesor y el
valor del enlace es null. Por ello los elementos son
registros que contienen el dato a almacenar y un enlace
al siguiente elemento. Los elementos de una lista,
suelen recibir también el nombre de nodos de la lista.
5. Para que esta estructura sea un TDA lista enlazada, debe tener unos
operadores asociados que permitan la manipulación de los datos
que contiene.
Los operadores básicos de una lista enlazada son:
Insertar: inserta un nodo con dato x en la lista, pudiendo
realizarse esta inserción al principio o final de la lista o bien en
orden.
Eliminar: elimina un nodo de la lista, puede ser según la
posición o por el dato.
Buscar: busca un elemento en la lista.
Localizar: obtiene la posición del nodo en la lista.
Vaciar: borra todos los elementos de la lista
6. Lista a base de vectores
Tiene que declararse el tamaño de la lista.
Exige sobrevaloración.
Consume mucho espacio.
Complejidad computacional de las operaciones:
Buscar el enésimo, tiempo constante
Visualizar y Buscar, tiempo lineal.
Insertar y Eliminar son costosas.
Insertar o eliminar un elemento exige, en promedio, desplazar
la mitad de los valores, O(n).
La construcción de una lista o la eliminación de todos sus
elementos podría exigir un tiempo cuadrático.
7. Implementación de listas a base de
apuntadores
Cada nodo apunta al siguiente; el ultimo no apunta a nada.
La lista es un puntero al primer nodo (y al ultimo).
Complejidad computacional de las operaciones:
Visualizar y Buscar, tiempo lineal.
Buscar el enésimo, tiempo lineal.
Eliminar realiza un cambio de apuntadores y una orden nuevo, O(1).
Usa Buscar anterior cuyo tiempo de ejecución es lineal.
Insertar tras una posición P requiere una llamada a new y dos
maniobras con apuntadores, O(1).
Buscar la posición P podría llevar tiempo lineal.
Un nodo cabecera facilita la inserción y la eliminación al comienzo
de la lista.
8. Implementación de listas
doblemente enlazadas
Cada nodo apunta al siguiente y al anterior.
Duplica el uso de la memoria necesaria para los
punteros.
Duplica el coste de manejo de punteros al insertar y
eliminar.
La eliminación se simplifica.
No es necesario buscar el elemento anterior.
12. pilas
Una pila, es una estructura de datos en la que el último
elemento en entrar es el primero en salir, lo que
también se denominan estructuras LIFO(Last In, First
Out).
En esta estructura sólo se tiene acceso a la cabeza o
cima de la pila.
13. Acceso limitado al ultimo elemento insertado.
Operaciones básicas: apilar, desapilar y cima.
Push: insertar la data en el tope de la pila.
Pop: remueve la data del tope de la pila.
Desapilar o cima en una pila vacía es un error en
el TDA pila.
Quedarse sin espacio al apilar es un error de
implementación.
Cada operación deberá tardar una cantidad
constante de tiempo en ejecutarse.
Con independencia del numero de elementos
apiladas.
14. Objetos Reales modelados en pila
Proporcionan un medio ordenado de demorar la
realización de las tareas secundarias que aparecen
durante la ejecución del programa.
•Suelen ir asociadas a algoritmos
recursivos.
•Tipos derivados: pilas de programas,
pila del analizador sintáctico (parser).
15. TAD PILAS
Invariante:n>0
Operaciones:crearPila()
Devuelve valor del tipo pila preparado para ser usado y
que contiene un valor de pila vacía.
Esta operación es la misma que la de las listas
generales.
Precondiciones:N=0
Poscondiciones:pilacread
16. insertarPila(crearPila)
Mediante este método se insertan datos a la pila ya creada.
Con las pilas se usa el método push para insertar.
Precondiciones: pila<>null
Poscondiciones:insertarPilacompletado (datos insertado
en pila)
borrarPila()
Con este método se elimina cierta pila de datos
Precondiciones:pila<>null
Poscondiciones:pilaeliminada
17. Cola
Una cola es una estructura de datos donde el primer
elemento en entrar es el primero en salir, también
denominadas estructuras FIFO (First In, First Out).
Esta estructura de datos se puede definir como una
lista enlazada con acceso FIFO a la que sólo se tiene
acceso al final de la lista para meter elementos y al
principio de esta para sacarlos.
19. Implementación circular a base de vectores
La implementación circular devuelve cabeza y fin
al principio del
vector cuando rebasan la ultima posición.
20.
21. Amortización de la duplicación del
vector
Cuando el vector no se duplica, toda operación se
realiza en tiempo constante.
La complejidad de una inserción con duplicación es
O(N).
La duplicación de un vector de N elementos esta
precedida, al menos, por N/2 inserciones que no
duplican el vector.
Repartiendo el coste O(N) de la duplicación entre las
inserciones precedentes.
El coste de insertar aumenta solo en una constante.
23. Cola con prioridades
En una cola de prioridad los elementos están
ordenados dependiendo de su prioridad, de tal forma
que este disponible (para las operaciones Frente y
Extraer) el elemento de máxima prioridad.
En caso de igualdad se sigue la regla FIFO, de dos
elementos con igual prioridad sale primero el que
primero entro.
Esto se puede conseguir bien insertando
ordenadamente y extrayendo el primer elemento.
24. TAD cola
Tipo: Unidimensional
Invariante: {Inv: N pertenece Z+}
Operaciones:
Cola_Crear x int > vector
Cola_Insertar vector x int x int > vector
Cola_Extraer vector x int > vector
Cola_Hayelementos vector > boolean
Cola_Eliminar vector x int > vector
Cola_llena vector x int > vector
Cola_Vaciar vector x int > vector
25. Objetos reales modelados con
colas
Las colas se utilizan en muchos algoritmos y en
situaciones en las que el rendimiento de dos sistemas
que se cruzan datos entre sí es más eficiente cuando no
se intercambian indicativos y señales de control
(handshaking) en cada transferencia.
•También almacenan temporalmente la transferencia de
información, lo que permite procesarla en origen y en
destino a tasas independientes.
•La cola de eventos en Java es un buen ejemplo.
•Tipos derivados: colas de prioridad y flujos de datos