06a - Arreglos Ordenados, Pilas, Colas Y Multilistas

  • Uploaded by: Christian Zambrano
  • 0
  • 0
  • February 2021
  • PDF

This document was uploaded by user and they confirmed that they have the permission to share it. If you are author or own the copyright of this book, please report to us by using this DMCA report form. Report DMCA


Overview

Download & View 06a - Arreglos Ordenados, Pilas, Colas Y Multilistas as PDF for free.

More details

  • Words: 2,181
  • Pages: 51
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.

Related Documents


More Documents from "Yago Gramajo Pascuali"