You are on page 1of 51

Variaciones de las estructuras de datos base

Unidad 06 Arreglos ordenados, pilas, colas y multilistas

Profesores

Alfredo Granda Juan Ramrez

Unidad 06 - Variaciones de las estructuras de datos base


Objetivos

Arreglos ordenados Bsqueda binaria Pilas Mtodos de implementacin de pilas Colas Mtodos de implementacin de colas Multilistas

Arreglos Ordenados

Arreglos Ordenados
Permiten mejorar la performance de bsqueda.
La desventaja es que se incrementa el tiempo de insercin. Los algoritmos de insercin y bsqueda son diferentes a los del arreglo no ordenado, sin embargo la eliminacin de un elemento es igual.

Operaciones de la ED Arreglo Ordenado


Insercin:
Duplicados No Permitidos
Se recorre el arreglo para buscar la posicin correcta en donde se insertara el nuevo elemento. Si no existe, se libera esta posicin moviendo todos los elementos a la derecha. Si no hay espacio suficiente se aumenta la capacidad del arreglo. Finalmente se escribe el elemento en la posicin correcta.

Duplicados Permitidos
Se recorre el arreglo para buscar la posicin correcta en donde se insertara el nuevo elemento. Se libera esta posicin moviendo todos los elementos a la derecha. Si no hay espacio suficiente se aumenta la capacidad del arreglo. Finalmente se escribe el elemento en la posicin correcta.

Operaciones de la ED Arreglo Ordenado


Bsqueda:
Existen 2 tipos de bsqueda que veremos en clase:
Bsqueda Lineal o Secuencial (Linear search). Bsqueda binaria (Binary Search).

Duplicados Permitidos
Requiere bsqueda entre los N elementos (considerando que se deben encontrar todos los valores).

Bsqueda Lineal en Arreglos Ordenados


Funciona igual que en el arreglo no ordenado, salvo que el algoritmo termina cuando se encuentra un tem mayor al que estamos buscando.

10 20 30 40 50 60 70 80 90 99

Si buscamos el nmero

45

Al llegar al 50 ya podemos estar seguros que no existe.

Bsqueda Binaria (Binary Search)


Es un algoritmo muy eficiente de bsqueda para grandes cantidades de datos.
Se basa en dividir el arreglo ordenado en la mitad, y hacer la bsqueda dentro de la mitad en donde se supone encontraremos el valor buscado. En realidad lo que hacemos es comparar el valor del medio contra nuestro valor buscado. Si nuestro valor es menor, buscaremos en la primera mitad; si es mayor, lo haremos en la segunda.

Bsqueda Binaria - Ejemplo


Adivinar un nmero entre 1 y 100.
Paso 0 1 2 3 4 50 25 37 31 Muy Alto Muy Bajo Muy Alto Muy Bajo Nmero adivinado Resultado Rango 1 - 100 1 - 49 26 - 49 26 - 36 32 - 36

5
6 7

34
32 33

Muy Alto
Muy Bajo Correcto

32 - 33
33 - 33

Algoritmo de bsqueda binaria


int busquedaBinaria(int arreglo[], int nElementos, int nBuscado) { // Definimos 2 variables que indiquen el rango de busqueda int limiteInferior = 0; int limiteSuperior = nElementos 1; // Inicializamos la posicin en -1 (no encontrado) int posicion = -1; // Mientras no lo encuentre o haya evaluado todas las posibilidades. while ( (posicion == -1) && (limiteSuperior >= limiteInferior) ) { int medio = (limiteInferior + limiteSuperior) / 2; if (arreglo[medio] == nBuscado) posicion = medio; else if (arreglo[medio] < nBuscado) limiteInferior = medio + 1; // El valor esta en la mitad superior else limiteSuperior = medio 1; // El valor esta en la mitad inferior } return posicion; }

Notacin Big O en Arreglos


Algoritmo
Bsqueda Lineal o Secuencial Bsqueda Binaria Insercin en Arreglos no ordenados Insercin en Arreglos ordenados Eliminacin en Arreglos no ordenados Eliminacin en Arreglos ordenados

Tiempo de Ejecucin
O(N) O(log N) O(1) O(N) O(N) O(N)

Pilas

Pilas
Son estructuras utilizadas muy a menudo como herramientas de programacin de tipo LIFO (Last inFirst out).
Permiten el acceso solo a un elemento a la vez: el ltimo elemento insertado.

La mayora de los procesadores utilizan una arquitectura basada en pilas.

Pilas - Operaciones
Bsicamente poseen tres operaciones primarias:
push (dato) inserta el dato en el tope de la pila pop () remueve el dato del tope de la pila peek () Permite visualizar el dato del tope de la pila.

Pilas - Otras Operaciones


Otras operaciones usualmente incluidas en el tipo de dato abstracto pila son:
empty () verifica si la pila est vaca o no. full() verifica si la pila est llena o no.

Pilas - Eficiencia
Push? Pop? Peek? Create?

Todas nos dan = O(1)

Mtodos de implementacin de pilas


Arreglos Listas

Pilas - Implementacin con arreglos


Una pila es una coleccin ordenada de objetos.
En C, los arreglos permiten almacenar colecciones ordenadas. La desventaja de implementar una pila mediante un arreglo es que esta ltima es de tamao fijo, mientras que la pila es de tamao dinmico.

Pilas - Implementacin con arreglos


0 1 2 3 4 5 6 7 8 9 10 11 12 13 14

10 50 46 80 23 11 13

push(45)
0 1 2

push(78)
3 4 5 6 7 8 9 10 11 12 13 14

10 50 46 80 23 11 13 45 78

pop
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14

10 50 46 80 23 11 13 45

Pilas - Implementacin con listas


Elimina la desventaja de los arreglos.
La capacidad es variable Todas las operaciones se hacen al inicio de la lista, manteniendo as el tiempo O(1).

Pilas - Implementacin con listas


Pila 50 46 80 23 11 13

push(45) Pila

push(78)

78

45

50

46

80

23

11

13

pop Pila 45 50 46 80 23 11 13

Aplicaciones de las pilas


Navegador Web
Se almacenan los sitios previamente visitados Cuando el usuario quiere regresar (presiona el botn de retroceso), simplemente se extrae la ltima direccin (pop) de la pila de sitios visitados.

Editores de texto
Los cambios efectuados se almacenan en una pila Usualmente implementada como arreglo Usuario puede deshacer los cambios mediante la operacin undo, la cual extraer el estado del texto antes del ltimo cambio realizado.

Evaluacin de expresiones. Balance de smbolos

Pilas con STL


Llamada stack
Tiene los siguientes mtodos:
push pop top empty

Ejemplo
#include <stdio.h> #include <stack> using namespace std; int main() { stack<int> pila; pila.push(20); if (!pila.empty()) {
printf(El numero en la pila es %d, pila.top()); pila.pop();

} printf(La pila esta vacia); return 0; }

Colas

Colas
Son estructuras utilizadas muy a menudo como herramientas de programacin de tipo FIFO (First inFirst out).
Simulan una cola de personas en el cine. Las colas son herramientas de programacin como las pilas.

Colas - Operaciones
Bsicamente poseen tres operaciones primarias:
encolar (dato) inserta el dato al final de la cola desencolar() remueve el dato al inicio de la cola peek () Permite visualizar el dato al inicio de la cola.

Colas - Otras Operaciones


Otras operaciones usualmente incluidas en el tipo de dato abstracto cola son:
empty () verifica si la cola est vaca o no. full() verifica si la cola est llena o no.

Pilas - Eficiencia
Encolar? Desencolar? Peek? Create?

Todas nos dan = O(1)

Mtodos de implementacin de colas


Arreglos Listas

Colas - Implementacin con arreglos


Una cola es una coleccin ordenada de objetos.
En C, los arreglos permiten almacenar colecciones ordenadas.

La desventaja de implementar una cola mediante un arreglo es que esta ltima es de tamao fijo, mientras que la cola es de tamao dinmico. Otra complicacin, es el mtodo desencolar, que para mantenerse de orden 1, no debe mover todos los elementos hacia la izquierda, y el mtodo encolar debe considerar siempre todo el espacio disponible.

Colas - Implementacin con arreglos


0 1 2 3 4 5 6 7 8 9 10 11 12 13 14

10 50 46 80 23 11 13
encolar(45)
0 1 2

encolar(78)
3 4 5 6 7 8 9 10 11 12 13 14

10 50 46 80 23 11 13 45 78
desencolar
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14

50 46 80 23 11 13 45 78 Caso especial: Que pasa si ahora se le dice encolar(10)


0 1 2 3 4 5 6 7 8 9 10 11 12 13 14

13 45 78 46 85 39 24 12 16

Colas - Implementacin con listas


Elimina las desventajas de los arreglos.
La capacidad es variable Los mtodos encolar y desencolar se simplifican colocando un puntero al final. Todas las operaciones se hacen al inicio o al final de la lista, manteniendo as el tiempo O(1).

Colas - Implementacin con listas


Cola 50 46 80 23 11 13

encolar(45) Cola 50

encolar(78)

46

80

23

11

13

45

78

desencolar
Cola 46 80 23 11 13 45 78

Aplicaciones de las colas


En general, operaciones en redes de computadoras Trabajos enviados a una impresora Solicitudes a un servidor.
Clientes solicitando ser atendidos por una telefonista. Simulaciones de cualquier situacin real en la que se presente una organizacin tipo cola. Simulacin de lneas de espera.

Colas con STL


Llamada queue
Tiene los siguientes mtodos:
push pop front back empty

Ejemplo
#include <stdio.h> #include <queue> using namespace std; int main() { queue<int> cola; cola.push(20); cola.push(40); if (!cola.empty()) {
printf(Extremos son %d y %d, cola.front(), cola.back()); cola.pop();

} return 0; }

Multilistas

Multilista
Una multilista es simplemente una lista (puede ser simple o doble) que tiene como dato otra lista (puede ser simple o doble).
El concepto de multilista se aplica por lo general con listas, pero es posible mezclar vectores con listas para crear una multilista.

Lista de Cursos
Supongamos que necesitamos almacenar una lista con los cursos de la UPC.
Cada curso contiene la siguiente informacin:
Cdigo del curso Nombre del curso

Para resolver el problema nos conviene utilizar una clase que almacene estos dos valores:
class CCurso { char Codigo[8]; char Nombre[40]; };

Lista de Cursos con STL


Una vez que tenemos la estructura podemos crear una lista utilizando STL.
list<CCurso *> Cursos;
Cursos
begin

Codigo Nombre

Codigo Nombre

Codigo Nombre

Next

Next

Next

Lista de Alumnos
Supongamos que necesitamos almacenar una lista con los alumnos de la UPC.
Cada alumno contiene la siguiente informacin:
Cdigo TIU Nombre Completo

Para resolver el problema nos conviene utilizar una clase que almacene estos dos valores:
class CAlumno { long TIU; char NomCompleto[120]; };

Lista de Alumnos con STL


Una vez que tenemos la estructura podemos crear una lista simple utilizando STL.
list<Calumno*> Alumnos;
Alumnos
begin

TIU NomCompleto

TIU NomCompleto

TIU NomCompleto

Next

Next

Next

Cursos y Alumnos
Cursos
begin

Codigo Nombre

Codigo Nombre

Codigo Nombre

Next

Next

Next

Alumnos
begin

TIU
NomCompleto

TIU
NomCompleto

TIU
NomCompleto

Next

Next

Next

Como podemos saber cules son los alumnos de un curso especfico?

Crear una multilista


Para solucionar el problema anterior, lo que podemos hacer es agregar a cada curso una lista de alumnos.
Class CCurso {
char Codigo[8]; char Nombre[40]; list<Calumno*> Alumnos; };

Multilista
Cursos
begin

Codigo Nombre Alumnos

Codigo Nombre Alumnos

Codigo Nombre Alumnos

Next

Next

Next

Ahora cada curso tiene un cdigo, nombre y una lista de alumnos.

Ejercicios de implementacin de multilistas


Utilizando STL implementar los siguientes mtodos:
Insertar Curso Insertar AlumnoEnCurso ListarAlumnosDeCurso ListarCursos DameCursoConMasAlumnos CursoExiste ListarCursosQueLlevaUnAlumno ListarCursosQueNoTienenAlumnos DameAlumnoConNumeroTIUMayor

Ejercicios

Ejercicios con pilas y colas


Implementar las clases Pila y Cola con arreglos, sin utilizar STL.
Implementar las clases Pila y Cola con listas, sin utilizar STL. Escribir una funcin que permita invertir una pila. Escribir una funcin que permita invertir una cola. Escribir una funcin que permita sacar un elemento de una pila por posicin. Considere que la pila solo tiene los mtodos descritos en una pila convencional.

Ejercicio con multilistas


Implementar una clase CMatriculaUPC que me permita llevar un control de los cursos y los alumnos que llevan cada uno de los cursos. La clase CMatriculaUPC deber tener como mnimo todos los mtodos descritos en la diapositiva anterior.
Desarrolle una aplicacin en entorno visual que permita administrar los cursos y los alumnos matriculados en cada curso. Considere que un mismo alumno se puede matricular en ms de 1 curso. (Duplique al alumno en cada curso).

Referencias
Cormen, Thomas H. and Others
Introduction to Algorithms, Second Edition. 2001.

Lafore, Robert
Data Structures and Algorithms in Java, Second Edition. 2003.

Shaffer, Clifford A.
Class Notes, Data Structures and File Processing, Department of Computer Science, Virginia Tech. Fall 2004.