Loading documents preview...
Variaciones de las estructuras de datos base Unidad 06 – Arreglos ordenados, pilas, colas y multilistas
Profesores
•Alfredo Granda •Juan Ramírez
Unidad 06 - Variaciones de las estructuras de datos base Objetivos
• • • • • • •
Arreglos ordenados Búsqueda binaria Pilas Métodos de implementación de pilas Colas Métodos de implementación de colas Multilistas
Arreglos Ordenados
Arreglos Ordenados • Permiten mejorar la performance de búsqueda. • La desventaja es que se incrementa el tiempo de inserción. • Los algoritmos de inserción y búsqueda son diferentes a los del arreglo no ordenado, sin embargo la eliminación de un elemento es igual.
Operaciones de la ED Arreglo Ordenado • Inserción: ▫ Duplicados No Permitidos Se recorre el arreglo para buscar la posición correcta en donde se insertara el nuevo elemento. Si no existe, se libera esta posición 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 posición correcta.
▫ Duplicados Permitidos Se recorre el arreglo para buscar la posición correcta en donde se insertara el nuevo elemento. Se libera esta posición 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 posición correcta.
Operaciones de la ED Arreglo Ordenado • Búsqueda: ▫ Existen 2 tipos de búsqueda que veremos en clase: Búsqueda Lineal o Secuencial (Linear search). Búsqueda binaria (Binary Search).
▫ Duplicados Permitidos Requiere búsqueda entre los N elementos (considerando que se deben encontrar todos los valores).
Búsqueda 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.
0
1
2
3
4
5
6
7
8
9
10 20 30 40 50 60 70 80 90 99
Si buscamos el número
45
Al llegar al 50 ya podemos estar seguros que no existe.
Búsqueda Binaria (Binary Search) • Es un algoritmo muy eficiente de búsqueda para grandes cantidades de datos. • Se basa en “dividir” el arreglo ordenado en la mitad, y hacer la búsqueda 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.
Búsqueda Binaria - Ejemplo • Adivinar un número entre 1 y 100. Paso
Número adivinado
Resultado
0
Rango 1 - 100
1
50
Muy Alto
1 - 49
2
25
Muy Bajo
26 - 49
3
37
Muy Alto
26 - 36
4
31
Muy Bajo
32 - 36
5
34
Muy Alto
32 - 33
6
32
Muy Bajo
33 - 33
7
33
Correcto
Algoritmo de búsqueda 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 posición 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; }
Notación Big O en Arreglos Algoritmo Búsqueda Lineal o Secuencial Búsqueda Binaria
Tiempo de Ejecución O(N) O(log N)
Inserción en Arreglos no ordenados
O(1)
Inserción en Arreglos ordenados
O(N)
Eliminación en Arreglos no ordenados
O(N)
Eliminación en Arreglos ordenados
O(N)
Pilas
Pilas • Son estructuras utilizadas muy a menudo como herramientas de programación de tipo LIFO (Last inFirst out). • Permiten el acceso solo a un elemento a la vez: el último elemento insertado.
• La mayoría de los procesadores utilizan una arquitectura basada en pilas.
Pilas - Operaciones • Básicamente 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á vacía o no.
▫
full() verifica si la pila está llena o no.
Pilas - Eficiencia • • • •
Push? Pop? Peek? Create?
Todas nos dan = O(1)
Métodos de implementación de pilas Arreglos Listas
Pilas - Implementación con arreglos • Una pila es una colección 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 tamaño fijo, mientras que la pila es de tamaño dinámico.
Pilas - Implementación con arreglos 0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
7
8
9
10
11
12
13
14
9
10
11
12
13
14
10 50 46 80 23 11 13
push(45) 0
1
push(78) 2
3
4
5
6
10 50 46 80 23 11 13 45 78
pop 0
1
2
3
4
5
6
7
10 50 46 80 23 11 13 45
8
Pilas - Implementación 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 - Implementación con listas Pila 50
push(45)
46
80
23
11
13
push(78)
Pila 78
45
50
46
80
23
11
pop Pila 45
50
46
80
23
11
13
13
Aplicaciones de las pilas • Navegador Web • Se almacenan los sitios previamente visitados • Cuando el usuario quiere regresar (presiona el botón de retroceso), simplemente se extrae la última dirección (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 operación “undo”, la cual extraer el estado del texto antes del último cambio realizado.
• Evaluación de expresiones. • Balance de símbolos
Pilas con STL • Llamada “stack” • Tiene los siguientes métodos: ▫ ▫ ▫ ▫
push pop top empty
Ejemplo #include <stdio.h> #include <stack> using namespace std; int main() { stack 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 programación de tipo FIFO (First inFirst out). • Simulan una cola de personas en el cine. • Las colas son herramientas de programación como las pilas.
Colas - Operaciones • Básicamente 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á vacía o no.
▫
full() verifica si la cola está llena o no.
Pilas - Eficiencia • • • •
Encolar? Desencolar? Peek? Create?
Todas nos dan = O(1)
Métodos de implementación de colas Arreglos Listas
Colas - Implementación con arreglos • Una cola es una colección 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 tamaño fijo, mientras que la cola es de tamaño dinámico. • Otra complicación, es el método desencolar, que para mantenerse de orden 1, no debe mover todos los elementos hacia la izquierda, y el método encolar debe considerar siempre todo el espacio disponible.
Colas - Implementación con arreglos 0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
7
8
9
10
11
12
13
14
9
10
11
12
13
14
13
14
10 50 46 80 23 11 13 encolar(45) 0
1
2
encolar(78) 3
4
5
6
10 50 46 80 23 11 13 45 78 desencolar 0
1
2
3
4
5
6
7
8
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 45 78 46 85 39 24 12 16
Colas - Implementación con listas • Elimina las desventajas de los arreglos. • La capacidad es variable • Los métodos 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 - Implementación con listas Cola 50
encolar(45)
46
80
23
11
13
46
80
23
11
13
45
78
46
80
23
11
13
45
78
encolar(78)
Cola 50
desencolar Cola
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 situación real en la que se presente una “organización” tipo cola. • Simulación de líneas de espera.
Colas con STL • Llamada “queue” • Tiene los siguientes métodos: ▫ ▫ ▫ ▫ ▫
push pop front back empty
Ejemplo #include <stdio.h> #include using namespace std; int main() { queue 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 información: ▫ Código 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 Cursos; Cursos begin
Next
Codigo
Codigo
Codigo
Nombre
Nombre
Nombre
Next
Next
Lista de Alumnos • Supongamos que necesitamos almacenar una lista con los alumnos de la UPC. • Cada alumno contiene la siguiente información: ▫ Código 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 Alumnos; Alumnos begin
TIU
TIU
TIU
NomCompleto
NomCompleto
NomCompleto
Next
Next
Next
Cursos y Alumnos Cursos begin
Codigo
Codigo
Codigo
Nombre
Nombre
Nombre
Next
Next
Next
Alumnos begin
TIU
TIU
TIU
NomCompleto
NomCompleto
NomCompleto
Next
Next
¿Como podemos saber cuáles son los alumnos de un curso específico?
Next
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 Alumnos; };
Multilista Cursos begin
Next
Codigo Nombre
Codigo Nombre
Codigo Nombre
Alumnos
Alumnos
Alumnos
Next
Next
Ahora cada curso tiene un código, nombre y una lista de alumnos.
Ejercicios de implementación de multilistas • Utilizando STL implementar los siguientes métodos: ▫ ▫ ▫ ▫ ▫ ▫ ▫ ▫ ▫
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 función que permita invertir una pila. • Escribir una función que permita invertir una cola. • Escribir una función que permita sacar un elemento de una pila por posición. Considere que la pila solo tiene los métodos 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 mínimo todos los métodos descritos en la diapositiva anterior. • Desarrolle una aplicación en entorno visual que permita administrar los cursos y los alumnos matriculados en cada curso. Considere que un mismo alumno se puede matricular en más 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.