Equipo03 Practica04 EDAII G09
Equipo03 Practica04 EDAII G09
Laboratorios de computación
salas A y B
Profesor: M.C. GERARDO TOVAR TAPIA
Grupo: 09
No. de práctica(s): 04
Semestre: 2023-1
Observaciones:
CALIFICACIÓN: __________
Índice
Nombre Página
Introducción 3
Desarrollo
Actividad 1 11
Actividad 2 12
Actividad 3 13
Actividad 4 14
Actividad 5 15
Actividad 6 16
Actividad 7 18
Conclusiones 19
Referencias 21
Código: MADO-20
Versión: 01
Manual de prácticas del Laboratorio
de Estructuras de datos y Página 3
algoritmos II Sección ISO 8.3
Fecha de emisión 20 de enero de 2017
Área/Departamento:
Facultad de Ingeniería
Laboratorio de computación salas A y B
La impresión de este documento es una copia no controlada
Algoritmos de búsqueda parte 1
Elaborado por:
Revisión:
35
Código: MADO-20
Versión: 01
Manual de prácticas del Laboratorio
de Estructuras de datos y Página 4
algoritmos II Sección ISO 8.3
Fecha de emisión 20 de enero de 2017
Área/Departamento:
Facultad de Ingeniería
Laboratorio de computación salas A y B
La impresión de este documento es una copia no controlada
Guía Práctica 4
Estructura de datos y Algoritmos II
Algoritmos de Búsqueda. Parte 1.
Objetivo: El estudiante identificará el comportamiento y características de algunos algoritmos de búsqueda
por comparación de llaves.
Actividades
Implementar el algoritmo iterativo y recursivo de búsqueda lineal en algún lenguaje de programación
para localizar alguna llave o valor en una secuencia de datos.
Implementar el algoritmo iterativo y recursivo de búsqueda binaria en algún lenguaje de programación
para localizar alguna llave o valor en una secuencia de datos.
Antecedentes
Análisis previo de los algoritmos en clase teórica.
Conocimiento de algún algoritmo de ordenamiento.
Manejo de arreglos o listas, estructuras de control y funciones en Python 3.
Introducción
Recuperar información de una computadora es una de las actividades más útiles e importantes, muy
comúnmente se tiene un nombre o llave que se quiere encontrar en una estructura de datos tales como una
lista u arreglo.
Al proceso de encontrar un dato específico llamado llave en alguna estructura de datos, se denomina búsqueda.
Este proceso termina exitosamente cuando se localiza el elemento que contienen la llave buscada, o termina sin
éxito, cuando no aparece ningún elemento con esa llave.
Los algoritmos de búsqueda se pueden clasificar en:
Búsqueda por comparación
Búsqueda por transformación de llaves
4
Código: MADO-20
Versión: 01
Manual de prácticas del Laboratorio
de Estructuras de datos y Página 5
algoritmos II Sección ISO 8.3
Fecha de emisión 20 de enero de 2017
Área/Departamento:
Facultad de Ingeniería
Laboratorio de computación salas A y B
La impresión de este documento es una copia no controlada
En este documento se describen dos de los algoritmos de búsqueda por comparación: la búsqueda lineal o
secuencial y la búsqueda binaria, que son dos de las técnicas más comunes; la primera por sencilla y la otra por
eficiente.
Búsqueda Lineal
En este algoritmo se empieza a buscar desde la primera posición de la lista, comparando el elemento con la llave
y si no se encuentra continúa verificando las siguientes posiciones hasta encontrarlo, entonces el algoritmo
termina. Así el elemento a buscar puede estar en el primer elemento, el último o entre ellos.
A continuación, se muestra un algoritmo en pseudocódigo de una función que realiza la búsqueda secuencial del
elemento 𝑥 en una lista implementada como un arreglo lineal 𝐴 0,1,2, … 𝑛 1 de 𝑛 elementos. El cual retorna
la posición o índice del arreglo donde se encuentra el elemento 𝑥 a buscar, y el valor de 1 si 𝑥 no fue
encontrado.
BúsquedaLineal (A,n,x )
Inicio
encontrado=-1
Para k=0 hasta n-1
Si x==A[k]
encontrado = k
Fin Si
Fin Para
Retorna encontrado
Fin
Como se puede observar en la función BúsquedaLineal( ), el número de iteraciones siempre es igual al tamaño del
arreglo 𝐴 , independientemente de dónde se encuentre el elemento a buscar y como todas las operaciones del
interior de la estructura de repetición tienen una complejidad constante, la complejidad de este algoritmo de
búsqueda secuencial es de 𝑂 𝑛 .
Existen varias mejoras al algoritmo, una de ellas es no esperar a revisar todos los elementos del arreglo, si el
buscado ya se encontró, entonces se tiene que terminar. Una forma de conseguirlo es revisar en cada iteración
𝑘, si el elemento a buscar 𝑥 es ya igual al elemento 𝐴 𝐾 , y si lo es, entonces retornar la posición del elemento
encontrado y terminar. A continuación, se muestra una posible función en pseudocódigo donde se considera
esta mejora [1].
5
Código: MADO-20
Versión: 01
Manual de prácticas del Laboratorio
de Estructuras de datos y Página 6
algoritmos II Sección ISO 8.3
Fecha de emisión 20 de enero de 2017
Área/Departamento:
Facultad de Ingeniería
Laboratorio de computación salas A y B
La impresión de este documento es una copia no controlada
BúsquedaLinealMejorado
Inicio
encontrado=-1
Para k=0 hasta n-1
Si A[k]==x
encontrado= k
Salir de la estructura de repetición
Fin Si
Fin Para
retorna encontrado
Fin
También se tiene la llamada búsqueda secuencial con centinela que asegura siempre encontrar el elemento a
buscar. Lo que se hace es situar el valor que se está buscando al final del arreglo 𝐴 𝑛 1 (centinela),
guardando lo que se encuentra inicialmente ahí en algún lugar temporal. Así en la estructura de repetición que
va revisando todos los elementos de 𝐴 siempre se obtiene un valor del índice 𝑘 donde se encuentra el
elemento.
Al término de las iteraciones se regresa el valor inicial del elemento 𝐴 𝑛 1 a su lugar y solo resta verificar si
éste o el posicionado en 𝑘 𝑛 1 es el valor buscado, si no es ninguno de ellos, entonces, el elemento no está
en la lista.
Lo anterior se puede representar en la siguiente función en pseudocódigo [1]
BusquedaLinealCentinela(A,n,x )
tmp=A[n-1]
A[n-1]=x
k=0
Mientras A[k] sea diferente de x
k=k+1
Fin Mientras
A[n-1]=tmp
6
Código: MADO-20
Versión: 01
Manual de prácticas del Laboratorio
de Estructuras de datos y Página 7
algoritmos II Sección ISO 8.3
Fecha de emisión 20 de enero de 2017
Área/Departamento:
Facultad de Ingeniería
Laboratorio de computación salas A y B
La impresión de este documento es una copia no controlada
En estos dos últimos algoritmos el tiempo de ejecución en el mejor de los casos se da cuando el valor a buscar se
encuentra en el primer elemento de la lista y es 𝜃(1). En el peor de los casos cuando está en la última posición y
es 𝜃(n).
Existe una versión recursiva del algoritmo de búsqueda lineal, donde se tendrá un caso base de fracaso que se
da cuando se rebasa el número de elementos de la lista y un caso base de éxito cuando después de algunas
llamadas recursivas el elemento analizado de la lista es igual a la llave. Un algoritmo en pseudocódigo se puede
plantear como se muestra en la siguiente función.
BusquedaLinealRecursiva (A,x,ini,fin)
Inicio
Si ini > fin
encontrado=-1
Si no
Si A[ini]==x
encontrado=ini
Si no
encontrado = BusquedaLinealRecursiva(A, x,ini+1,fin)
Fin Si no
Fin Si no
retorna encontrado
Fin
Búsqueda Binaria
El algoritmo de búsqueda binaria o también llamado dicotómica es eficiente para encontrar un elemento en una
lista ya ordenada y es un ejemplo de la técnica divide y conquista. Es como buscar una palabra en un diccionario,
donde dependiendo de la primera letra de la palabra a buscar se abre el libro cerca del principio, del centro o al
final. Se puede tener suerte y haber abierto la página correcta o bien moverse a paginas posteriores o anteriores
del libro.
Entonces en el algoritmo se divide repetidamente a la mitad la porción de la lista que podría contener al
elemento, hasta reducir las ubicaciones posibles a solo una. La estrategia consiste en comparar una llave con el
elemento de en medio de la lista, si es igual entonces se encontró el elemento, sino, cuando 𝑥 es menor que el
elemento del medio se aplica la misma estrategia a la lista de la izquierda y si 𝑥 es mayor, a la lista de la derecha.
7
Código: MADO-20
Versión: 01
Manual de prácticas del Laboratorio
de Estructuras de datos y Página 8
algoritmos II Sección ISO 8.3
Fecha de emisión 20 de enero de 2017
Área/Departamento:
Facultad de Ingeniería
Laboratorio de computación salas A y B
La impresión de este documento es una copia no controlada
Para describir el algoritmo con más detalle, se supone una la lista ordenada de forma ascendente que está
almacenada en un arreglo unidimensional 𝐴 0, … , 𝑛 1 de 𝑛 elementos y se quiere encontrar la llave 𝑥.
1. Primero se calcula el índice del punto medio del arreglo utilizando los índices de inicio (izquierdo) y fin
(derecho) de la lista o sublista de búsqueda, 𝑚𝑒𝑑𝑖𝑜 , para poder dividir
la lista en dos sub‐listas Figura 4.1.
medio
Índice Izquierdo = 0 Índice Derecho = n‐1
Sub‐lista izquierda Sub‐lista derecha
Figura 4.1
2. Después se compara el punto 𝑚𝑒𝑑𝑖𝑜 con la llave a buscar 𝑥,
a) Si son iguales, entonces la llave fue encontrada, y el algoritmo termina. Figura 4.2.
Figura 4.2
Índice derecho = medio ‐1
Índice Izquierdo
Figura 4.3
c) Si el valor del arreglo 𝐴 con índice 𝑚𝑒𝑑𝑖𝑜 es menor a la llave 𝑥 (𝐴 𝑚𝑒𝑑𝑖𝑜 𝑥), se descarta la sub‐lista
de la izquierda incluyendo el punto medio y se regresa al paso 1, donde la nueva sub‐lista de búsqueda
mantiene el índice derecho y el índice izquierdo cambia a 𝑚𝑒𝑑𝑖𝑜 1.Figura 4.4.
Índice Izquierdo = medio Índice Derecho
Figura 4.4
8
Código: MADO-20
Versión: 01
Manual de prácticas del Laboratorio
de Estructuras de datos y Página 9
algoritmos II Sección ISO 8.3
Fecha de emisión 20 de enero de 2017
Área/Departamento:
Facultad de Ingeniería
Laboratorio de computación salas A y B
La impresión de este documento es una copia no controlada
Si en algún momento la sub‐lista de búsqueda tiene longitud 0 o negativa significa que el valor buscado no se
encuentra en la lista.
Ejemplo: Se quiere buscar el elemento 𝑥 18 en un arreglo unidimensional de 13 elementos que contiene los
siguientes datos, los cuales ya están ordenados:
0 1 2 3 4 5
10 12 13 14 18 20
Se compara 18 con 13, como 18 13, ahora se trabaja con la sub‐lista derecha:
3 4 5
14 18 20
Una función del algoritmo en pseudocódigo de la búsqueda binaria descrita es:
9
Código: MADO-20
Versión: 01
Manual de prácticas del Laboratorio
de Estructuras de datos y Página 10
algoritmos II Sección ISO 8.3
Fecha de emisión 20 de enero de 2017
Área/Departamento:
Facultad de Ingeniería
Laboratorio de computación salas A y B
La impresión de este documento es una copia no controlada
BusquedaBinariaIterativa(A,x,indiceIzq,indiceDer)
Inicio
Encontrado= ‐1
Mientras indiceIzq <= indiceDer
Medio=⌊ 𝑖𝑛𝑑𝑖𝑐𝑒𝐼𝑧𝑞 𝐼𝑛𝑑𝑖𝑐𝑒𝐷𝑒𝑟 /2⌋
Si x == A[Medio] entonces
Encontrado=Medio
Si no
Si A[medio] < x
indiceIzq=medio +1
Si no
indiceDer=medio‐1
Fin Si no
Fin Si no
Fin Mientras
Retorna Encontrado
Fin
El algoritmo de búsqueda binaria también tiene un enfoque recursivo. Donde se tiene un caso base de fracaso,
que sucede cuando se sobrepasa el número de elementos de la lista y un caso base de éxito, cuando después de
algunas llamadas recursivas el elemento 𝐴 𝑚𝑒𝑑𝑖𝑜 es igual a la llave 𝑥.
A continuación, se muestra una función en pseudocódido que ilustra la forma recursiva:
BusquedaBinariaRecursiva(A,x,indiceIzq,indiceDer)
Inicio
Si indiceIzquierdo > indiceDerecho y x es diferente de A[indiceDerecho]
Retorna -1
Fin Si
𝑚𝑒𝑑𝑖𝑜 ⌊ 𝑖𝑛𝑑𝑖𝑐𝑒𝐼𝑧𝑞 𝐼𝑛𝑑𝑖𝑐𝑒𝐷𝑒𝑟 /2⌋
Si x==A[medio]
Retorna medio
En otro caso
Si x < A[medio]
Retorna BusquedaBinariaRecursiva(A,x,indiceIzquierdo,medio)
En otro caso
Retorna BusquedaBinariaRecursiva(A,x,medio, indiceDerecho)
Fin Si
Fin Si
Fin
10
Desarrollo
Actividades complementarias práctica 4
Actividad 1
Actividad 1.pý
Ejecución
11
Actividad 2
La mejora consiste en poner un break después de asignar k a encontrado, esto permite que
una vez que se encontró el valor buscado, ya no realice todas las iteraciones del for, esto se
debe a que resultan innecesarias si se encontró el valor buscado en el arreglo.
Código
Actividad 2.pý
Ejecución
12
Actividad 3
La función guarda en una variable auxiliar el valor del último elemento en el arreglo y lo
reemplaza con el valor buscado, posterior a esto, a partir de un ciclo while trata de localizar
si el elemento buscado se encuentra en dicho arreglo incrementando en 1 el valor de k.
Después de terminar el ciclo while se regresa el último valor del arreglo a su respecto índice
con el auxiliar, ya que de no hacerlo se modificaría el arreglo original.
Por último con ayuda de un if se comprueba si dicho valor está dentro del arreglo con k < n
o A[n] == x, sí este es el caso regresa el índice en donde se encuentra el valor buscado, de
no ser así quiere decir que el valor no se encuentra en el arreglo y se retorna -1
Código
Actividad 3.pý
Ejecución
13
Actividad 4
Actividad 4.pý
Ejecución
14
Actividad 5
Tomando como referencia el código que se analizó en clase, hacer funcionar el código de la
función que a continuación se presenta.
Actividad 5.pý
Ejecución
15
Actividad 6
Se agregó la función input que guarda el valor que se desea buscar en una variable llamada
x y se manda este valor, el arreglo, la posición inicial y final del arreglo a la función
BusquedaBinRecursiva, el primer if se utiliza para la recursividad del código, mientras el
índice izquierdo sea menor al índice derecho, la función se va a ejecutar, si el índice
izquierdo es mayor al índice derecho, se rompe la recursividad regresando el valor -1 lo cual
significa que el valor buscado no se encuentra en el arreglo. Después utilizando la función
if-elif, se va analizando en donde se encuentra el valor a buscar utilizando una variable
medio que es el índice central del arreglo, si el valor medio es el valor buscado se regresa el
índice del medio, si el medio es menor al valor buscado, se repite la función pero
descartando el fragmento del punto medio a la izquierda del arreglo, en cambio, si el medio
es mayor al valor buscado, se repite la función pero ahora descartando el tramo del punto
medio a la derecha del arreglo.
16
Código
Actividad 6.py
Ejecución
17
Actividad 7
1. Medio. Primero se calculará el valor de en medio del arreglo, o la mitad del arreglo
2. Si el valor de en medio calculado es el valor buscado entonces se imprimirá en
pantalla el índice del valor medio y terminará el programa.
3. En caso de que el valor medio no sea el valor buscado y sea menor que el valor
buscado se descartaran los valores detrás del medio y se continuará con el
elemento siguiente al medio, después se repetirá el mismo proceso desde el paso 1
4. En caso de que el valor medio no sea el valor buscado y sea mayor que el valor
buscado se descartaran todos los elementos delante del medio y se continuará con
el elemento anterior al medio, después se repetirá el proceso desde el paso 1.
5. En caso de no encontrar una coincidencia, se imprimirá un -1 en pantalla
18
Conclusiones
Bohorquez Oclica Nancy:
Se cumplieron los objetivos de la práctica ya que aprendimos a identificar las
características y comportamiento de los algoritmos de búsqueda lineal y binaria. A lo
largo de la práctica realizamos algunas actividades que nos ayudaron a comprender
mejor el funcionamiento de cada algoritmo de búsqueda, además, aprendimos que
los algoritmos de búsqueda se pueden programas de dos formas diferentes,
utilizando funciones de iteración o recursividad. También aprendimos que existen
varias mejoras que se pueden agregar al algoritmo de búsqueda lineal.
Aportación: Codificación y desarrollo de la actividad 6.
19
Villeda Tlecuitl José Eduardo:
Los objetivos de la práctica fueron cumplidos exitosamente gracias a que durante
las clases de teoría revisamos minuciosamente los métodos de búsqueda (binaria y
lineal) por lo que al realizar la práctica era solo poner en práctica lo que aprendimos
durante las últimas sesiones que tuvimos.
Aportación:Codificación y desarrollo de la actividad 5
20
Código: MADO-20
Versión: 01
Manual de prácticas del Laboratorio
de Estructuras de datos y Página 21
algoritmos II Sección ISO 8.3
Fecha de emisión 20 de enero de 2017
Área/Departamento:
Facultad de Ingeniería
Laboratorio de computación salas A y B
La impresión de este documento es una copia no controlada
Referencias
[1] CORMEN, Thomas
Algorithms Unlocked
Cambridge MA, USA
The MIT Press, 2013
21