06a - Arreglos Ordenados, Pilas, Colas y Multilistas

download 06a - Arreglos Ordenados, Pilas, Colas y Multilistas

of 51

Transcript of 06a - Arreglos Ordenados, Pilas, Colas y Multilistas

Estructura de datos y algoritmos

Variaciones de las estructuras de datos baseUnidad 06 Arreglos ordenados, pilas, colas y multilistasAlfredo GrandaJuan RamrezProfesoresUnidad 06 - Variaciones de las estructuras de datos baseObjetivosArreglos ordenadosBsqueda binariaPilasMtodos de implementacin de pilasColasMtodos de implementacin de colasMultilistas

Arreglos OrdenadosArreglos OrdenadosPermiten 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.

4Operaciones de la ED Arreglo OrdenadoInsercin: Duplicados No PermitidosSe 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 PermitidosSe 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.5En ambos casos la insercin se hace en un solo paso.Operaciones de la ED Arreglo OrdenadoBsqueda:Existen 2 tipos de bsqueda que veremos en clase:Bsqueda Lineal o Secuencial (Linear search).Bsqueda binaria (Binary Search).

Duplicados PermitidosRequiere bsqueda entre los N elementos (considerando que se deben encontrar todos los valores).6Bsqueda Lineal en Arreglos OrdenadosFunciona igual que en el arreglo no ordenado, salvo que el algoritmo termina cuando se encuentra un tem mayor al que estamos buscando.10020130240350460570680790899945Si buscamos el nmeroAl 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 - EjemploAdivinar un nmero entre 1 y 100.PasoNmero adivinadoResultadoRango01 - 100150Muy Alto1 - 49225Muy Bajo26 - 49337Muy Alto26 - 36431Muy Bajo32 - 36534Muy Alto32 - 33632Muy Bajo33 - 33733CorrectoAlgoritmo de bsqueda binariaint busquedaBinaria(int arreglo[], int nElementos, int nBuscado){// Definimos 2 variables que indiquen el rango de busquedaint 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 superiorelselimiteSuperior = medio 1; // El valor esta en la mitad inferior

}

return posicion;}10Notacin Big O en ArreglosAlgoritmoTiempo de EjecucinBsqueda Lineal o SecuencialO(N)Bsqueda BinariaO(log N)Insercin en Arreglos no ordenadosO(1)Insercin en Arreglos ordenadosO(N)Eliminacin en Arreglos no ordenadosO(N)Eliminacin en Arreglos ordenadosO(N)PilasPilasSon estructuras utilizadas muy a menudo como herramientas de programacin de tipo LIFO (Last in-First 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 - OperacionesBsicamente 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 OperacionesOtras 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 - EficienciaPush?Pop?Peek?Create?

Todas nos dan = O(1)

Mtodos de implementacin de pilasArreglosListasPilas - Implementacin con arreglosUna 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 arreglos105046802311130123456789101112131410504680231113457801234567891011121314push(45)push(78)105046802311134501234567891011121314popPilas - Implementacin con listasElimina 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 listaspush(45)push(78)50Pilapop468023111350Pila4680231113457850Pila468023111345Aplicaciones de las pilasNavegador WebSe almacenan los sitios previamente visitadosCuando el usuario quiere regresar (presiona el botn de retroceso), simplemente se extrae la ltima direccin (pop) de la pila de sitios visitados.

Editores de textoLos cambios efectuados se almacenan en una pilaUsualmente implementada como arregloUsuario 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 smbolosPilas con STLLlamada stack

Tiene los siguientes mtodos:pushpoptopemptyEjemplo#include #include 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;}

ColasColasSon estructuras utilizadas muy a menudo como herramientas de programacin de tipo FIFO (First in-First out).

Simulan una cola de personas en el cine.

Las colas son herramientas de programacin como las pilas.Colas - OperacionesBsicamente 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 OperacionesOtras 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 - EficienciaEncolar?Desencolar?Peek?Create?

Todas nos dan = O(1)

Mtodos de implementacin de colasArreglosListasColas - Implementacin con arreglosUna 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.78Colas - Implementacin con arreglos105046802311130123456789101112131410504680231113457801234567891011121314encolar(45)encolar(78)5046802311134501234567891011121314desencolar78134546853924121601234567891011121314Caso especial: Que pasa si ahora se le dice encolar(10)Colas - Implementacin con listasElimina las desventajas de los arreglos.

La capacidad es variableLos 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 listas50Coladesencolar468023111350Cola46802311134578encolar(45)encolar(78)Cola46802311134578Aplicaciones de las colasEn general, operaciones en redes de computadorasTrabajos enviados a una impresoraSolicitudes 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 STLLlamada queue

Tiene los siguientes mtodos:pushpopfrontbackemptyEjemplo#include #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;}

MultilistasMultilistaUna 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 CursosSupongamos que necesitamos almacenar una lista con los cursos de la UPC.

Cada curso contiene la siguiente informacin:Cdigo del cursoNombre 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 STLUna vez que tenemos la estructura podemos crear una lista utilizando STL.

list Cursos;

beginCursosCodigoNextNombreCodigoNextNombreCodigoNextNombreLista de AlumnosSupongamos que necesitamos almacenar una lista con los alumnos de la UPC.

Cada alumno contiene la siguiente informacin:Cdigo TIUNombre 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 STLUna vez que tenemos la estructura podemos crear una lista simple utilizando STL.

list Alumnos;

beginAlumnosTIUNextNomCompletoTIUNextNomCompletoTIUNextNomCompletoCursos y AlumnosbeginCursosCodigoNextNombreCodigoNextNombreCodigoNextNombrebeginAlumnosTIUNextNomCompletoTIUNextNomCompletoTIUNextNomCompletoComo podemos saber cules son los alumnos de un curso especfico?Crear una multilistaPara 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;

};

MultilistabeginCursosCodigoNextNombreAlumnosCodigoNextNombreAlumnosCodigoNextNombreAlumnosAhora cada curso tiene un cdigo, nombre y una lista de alumnos.Ejercicios de implementacin de multilistasUtilizando STL implementar los siguientes mtodos:Insertar CursoInsertar AlumnoEnCursoListarAlumnosDeCursoListarCursosDameCursoConMasAlumnosCursoExisteListarCursosQueLlevaUnAlumnoListarCursosQueNoTienenAlumnosDameAlumnoConNumeroTIUMayorEjerciciosEjercicios con pilas y colasImplementar 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 multilistasImplementar 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).

ReferenciasCormen, Thomas H. and OthersIntroduction to Algorithms, Second Edition. 2001.

Lafore, RobertData 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.

51