Está en la página 1de 21

Carátula para entrega de prácticas

Facultad de Ingeniería Laboratorio de docencia

Laboratorios de computación
salas A y B
Edgar Tista Garcia
Profesor:

Estructura De Datos y Algoritmos II


Asignatura:

4
Grupo:

4
No. de práctica(s):

Celis Hernández Ronie


Integrante(s):

07
No. de lista o brigada:

2022-2
Semestre:

9/03/2022
Fecha de entrega:

Observaciones:

CALIFICACIÓN: __________
Objetivos:
Objetivo: El estudiante identificará el comportamiento y características de los principales algoritmos de
búsqueda por comparación de llaves.
Objetivo de clase: El alumno aplicará la búsqueda por comparación de llaves mediante la implementación
de listas de tipos de datos primitivos y de tipos de datos abstractos.

Desarrollo:
Ejercicio 1. Listas en Java.
Lo primero que se solicita en este código es codificar el código que se proporcionó, es importante
resaltar que en este código se usan listas y hay una parte en la que se pide agregar 5 elementos más
a la lista con la instrucción. add(). A continuación, se muestra esta parte del código:
a. Explica la diferencia entre los métodos “set” y “add”.

La diferencia esta en que se usa para reemplazar un elemento ya existente en una lista, en cambio con add lo
que se hace es añadir ese elemento en esa posición, sin borrar el elemento que ya estaba antes. A
continuación, se muestran imágenes de la ejecución del código para poder comprender mejor esto:

Como se puede observar en la imagen anterior el elemento que estaba en la posición 2 era el 10, después
de efectuar la operación lista1.add (2,300), el elemento que esta en la posición 2 pasa a ser 300, pero el
10 no se eliminó, solo se recorrió una posición hacia adelante.
Pero si se utiliza el método set ocurre algo como lo siguiente:

Como se puede observar al utilizar el método set el valor simplemente se reemplaza, en este caso el
elemento con índice 7 inicialmente era 12, después de ejecutar la instrucción el número simplemente se
reemplazó. A grandes rasgos esta es la diferencia entre set y add.
b. Explica el funcionamiento del método sublist.

El método sublist lo que hace es regresar una sublista, recibe como parámetros el valor inferior a partir
del cual se quiere crear la sublista, y el valor mayor.

En caso de que se quiera obtener una sublista del 16 al 10 y almacenarla


en otra variable, la instrucción seria la siguiente:
lista2=lista1.sublist(2,4);
Como se puede ver se considera el índice de la lista como primer parámetro
y como segundo parámetro el lugar en el que se encuentra el elemento, en
este caso el índice del número 16 es el 2, y el lugar en el que se encuentra
el número 10 es el 4.

El resultado de realizar la instrucción explicada anteriormente es el


siguiente:
c. Investiga (y agrega las instrucciones respectivas en el programa) cuales son los métodos de java para
las siguientes operaciones:

i). borrar un elemento de la lista.

Para poder borrar un elemento de una lista se puede usar el método. remove(int index) que recibe como
parámetro el índice del número que se quiere eliminar. A continuación, se muestra un ejemplo de esto:
En caso de que se quiera eliminar el número 10 se debe
analizar el índice en el que se encuentra, para esto se
tiene que el índice es el número 3, si queremos eliminar
este elemento se debe usar la instrucción:

lista1.remove(3);
Después de efectuar la instrucción lista1.remove(3), el resultado es algo como lo siguiente:

De este modo podemos comprobar que una forma eficiente de poder remover un elemento de una lista en
Java es con el método .remove()

ii)Para saber si está vacía.

Para poder saber si una lista está vacía, se usó otro método que es .clear(), básicamente permite eliminar
los datos que tiene una lista. Después de esto usamos el método. isEmpty(), que básicamente regresa
como dato un tipo de dato booleano, indicando un true si la lista esta vacía y un false si no esta vacía :
iii)Para buscar algún elemento.
Para buscar algún elemento en la lista se puede usar el método Index of , básicamente lo que permite este
método es ingresar un número a la lista y devuelve el índice, en caso de no encontrar el número devuelve
un -1, a continuación se muestra esto:

Como se puede ver en la imagen anterior se creo una lista nueva, y se usa el método index of para un
número que si existe en la lista (en este caso 50) y para un numero que no existe en la lista(en este caso
100), el resultado de la ejecución es algo como lo siguiente :

Ejercicio 2. Búsqueda Lineal.

Para el segundo ejercicio lo que se hará será implementar la búsqueda lineal para las listas, como se sabe
la búsqueda lineal consiste simplemente en la comparación de elemento por elemento de la lista con un
recorrido de forma lineal hasta encontrar el número deseado.

Una de las primeras cosas que solicita este ejercicio es crear un método que permita devolver un valor
verdadero o falso si se encuentra el número en la lista, para esto simplemente se recorre la lista y se utiliza
un condicional, como se muestra en la siguiente imagen:
En dado caso de que se encuentre el elemento en la lista se devuelve un valor true y en caso de que no se
encuentre se devuelve un valor false, ambos son tipos de datos booleanos, la ejecución de la búsqueda es
la siguiente:

Otro de los métodos que tenemos que implementar es uno que devuelva el índice donde se encuentra la
clave, para esto se pensó en dos alternativas, una es que devuelva el ultimo índice en donde fue
encontrada la clave y otro que es que se devuelva un arreglo completo con los índices en donde se
encontró la clave, a continuación, se explican a lujo de detalle las dos alternativas que se plantearon
para poder dar solución a este problema:
Primera alternativa:

Lo que se hizo para poder encontrar el ultimo índice en la lista se resume en los siguientes puntos:

 Invertir la lista y después realizar una búsqueda lineal, esto es debido a que si se buscar el índice
solamente realizando una búsqueda lineal el índice que se va a regresar es el primero que se haya
encontrado.
 Invertir las posiciones de la lista y asociarlas a la lista invertida.
 En caso de no encontrar el último índice de la lista simplemente retornar el valor -1
El código para esta primera alternativa es el siguiente que se muestra en pantalla:
Para poder comprobar que el código que se muestra en pantalla funciona a continuación se adjunta una prueba
de la ejecución del código:

Segunda Alternativa:

Como segunda alternativa se implementó un método extra que podría resultar conveniente, lo que se hizo fue
simplemente meter todos los índices iguales que encuentre en un arreglo, como se muestra en la siguiente
parte del código:
Como se puede apreciar es un método que regresa un arreglo, en este caso regresa un arreglo con todos los
índices en los que se encuentra el dato, esto podría resultar conveniente para ciertas operaciones en concreto.
A continuación, se muestra una prueba de la ejecución de este método:
Ejercicio 3. Búsqueda Binaria.

Para poder realizar este ejercicio lo que se hizo fue implementar un método extra que permita obtener el
número dada la posición que tiene en la lista, esto permite implementar de forma más factible un método de
búsqueda binaria. A Continuación, se muestra el método del que se habla:

Como se puede ver este método regresar el número dada la posición que tiene en la lista, con esto simplemente
se puede implementar la función de búsqueda Binaria como se haría comúnmente como un arreglo, se hizo
de esta forma porque se debe considerar que no es posible utilizar los métodos que se disponen en las listas.
A continuación, se muestra la estructura que tiene el método para poder encontrar si un elemento esta en la
lista o no:
El resultado de la ejecución de este método es el siguiente:

También se tiene el método que permite encontrar el número de ocurrencias, aquí simplemente lo que se hizo
fue hallar el primer y el último índice, esto con el fin de utilizar la siguiente expresión para poder encontrar
la cantidad de ocurrencias:

𝑇𝑜𝑡𝑎𝑙𝑂𝑐𝑢𝑟𝑟𝑒𝑛𝑐𝑖𝑎𝑠 = 𝑈𝑙𝑡𝑖𝑚𝑜𝐼𝑛𝑑𝑖𝑐𝑒 − 𝑃𝑟𝑖𝑚𝑒𝑟𝐼𝑛𝑑𝑖𝑐𝑒 + 1

A continuación, se explica con un mejor ejemplo el razonamiento de eso:

Se parte del hecho de que para que la búsqueda binaria funcione debe estar ordenada, es decir que si hay
elementos iguales deben estar de forma consecutiva, suponiendo que tenemos una lista como:

Lista={1,2,2,2,3}

Se desea hallar la cantidad de ocurrencias del número 2 dadas sus posiciones:


Lista 1 2 2 2 3
Posición 0 1 2 3 4

Primer Indice :1

Ultimo Indice: 3

𝑇𝑜𝑡𝑎𝑙𝑂𝑐𝑢𝑟𝑟𝑒𝑛𝑐𝑖𝑎𝑠 = 1 + 3 − 1 = 3
Al probar esta idea implementada en código se tiene una ejecución como la siguiente:

Ejercicio 4. Búsquedas en listas de Objetos.

Este es el ejercicio más interesante de la práctica, se ponen a prueba las listas de objetos y las formas que se
tienen para poder buscar información dentro de estas. Para poder completar este ejercicio lo primero que se
hará será crear nuestros 3 atributos principales de la clase, que en este caso serán el nombre de la asignatura,
la clave de la asignatura y el nombre del profesor:

Dentro de los métodos constructores que creamos se encuentran los siguientes:


Como podemos ver hay un método constructor que ya tiene algunos valores predefinidos para el nombre de
la asignatura y la clave, esto resultara conveniente posteriormente.
Ahora que ya se tienen los métodos constructores podemos empezar a crear nuestros primeros objetos en la
clase principal, es importante recalcar que estos objetos van a ser listas de objetos, es decir que una lista va a
contener a un objeto distinto en cada posición, a continuación se adjunta una imagen de la forma en la que se
crearon estas listas de objetos:

Como es posible apreciar tenemos una lista inicial con 4 asignaturas, y usamos como ventaja uno de los
métodos constructores que ya habíamos definido con anterioridad para poder crear de forma más rápida ciertos
objetos. Después de haber hecho esto simplemente metemos a todos los objetos dentro de nuestra lista, como
se muestra a continuación:

Ya con todo esto definido podríamos imprimir la información en pantalla para mostrar que las cosas van
funcionando perfectamente hasta el momento, pero aquí se intentara hacer algo especial y es que toda la
información se mostrara de la forma más ordenada posible, para ello se implementaron los siguientes métodos:

El método encabezado nos ayudara a imprimir el encabezado de toda la información que vamos a mostrar,
como se puede ver muestra el tipo de atributo que se definió en un principio en pantalla. Después de esto
creamos un método que nos ayude a imprimir la información de las listas de objetos en pantalla:
Cuando se itera todo de la manera adecuada y se combinan los dos métodos antes explicados el resultado de
la ejecución es algo como esto:

Todo esto es algo extra a lo que se pide, pero se consideró que es importante mostrar la información de manera
ordenada para tener un mejor entendimiento del código al momento de realizar la ejecución.

Ya con todo el ambiente preparado es importante implementar las funciones principales que son las que le
darán vida al programa (las funciones de búsqueda lineal). Para este programa las funciones de búsqueda
lineal irán orientadas a la búsqueda por clave y a la búsqueda por asignatura. A continuación, se muestra la
forma en la que se implementó la búsqueda lineal para encontrar la clave:
Como se puede observar se usa un dato de tipo booleano para poder identificar si la clave fue encontrada o
no, en caso de que no simplemente le muestra un mensaje al usuario indicándole que no se encontró la clave.
De momento solamente se mostrará este método, esto debido a que el método para la búsqueda por materia
funciona de forma bastante similar, así que para la explicación no se considero tan importante explicar este
punto. Lo que si se mostrara es la ejecución del programa para ver la forma en la que se comporta esta parte
del programa:

En la imagen anterior se puede ver que la búsqueda por clave funciona perfectamente, ahora vamos a la
búsqueda por materia, que básicamente realiza esta misma búsqueda, pero utilizando un dato de tipo String:
A pesar de que el programa podría terminar aquí, se decidió agregar una opción extra que le permita agregar
más asignaturas al usuario, esto se logró implementando un método que devuelve un objeto y posteriormente
este objeto es añadido a la lista en la función principal. Pero más allá de eso este método es demasiado útil
para ver las aplicaciones más concretas que pudieran tener los algoritmos de búsqueda. A continuación, se
muestra el código junto con su explicación:

Es posible ver en la imagen que lo primero que se hace es buscar la clave de la asignatura, ¿Con que fin se
hace esto?, la respuesta es simple, si el usuario ingresa una clave que ya existe entonces eso significa que hay
dos atributos que no van a cambiar, los cuales son la materia y la clave. De modo que antes de permitirle al
usuario ingresar cualquier clave primero se debe analizar si la clave en cuestión ya existe, en dado caso de ser
así simplemente se le solicita el nombre del profesor. Es aquí donde se tiene una aplicación de los algoritmos
de búsqueda para un caso demasiado concreto.
En caso de que el usuario ingrese una clave que no existe se procede a pedirle el nombre de la asignatura y el
nombre del profesor. En cualquiera de los dos casos anteriores se crea un nuevo objeto y se retorna a la función
principal, donde se agregará ese objeto a la lista de objetos.
A continuación, se muestra la ejecución del método que se explicó con anterioridad:

Conclusiones:

Esta práctica fue de muchísima utilidad para poder comprender de mejor forma la manera en la que trabajan
los algoritmos de búsqueda, por esta misma razón además es posible afirmar que los objetivos de la práctica
se cumplieron.
No solamente lo mencionado anteriormente, además fue posible ver las aplicaciones que tienen estos
algoritmos de búsqueda en un sistema real. Es posible encontrarse hoy en día con demasiadas aplicaciones en
las que parte de su funcionamiento consiste en realizar una búsqueda, aquí se implemento una idea bastante
similar utilizando una lista de objetos con distintos atributos para poder realizar una búsqueda dado uno de
sus atributos y posteriormente mostrar en pantalla todos los objetos de la lista que cumplían con esas
características.

Al final el conocimiento que me he llevado realizando esta práctica ha sido satisfactorio, se logro comprender
de mejor forma la búsqueda binaria y la búsqueda lineal.

También podría gustarte