Está en la página 1de 42

Instituto Tecnológico Superior de Guasave

Ingeniería en Sistemas Computacionales


Estructura de Datos
Unidad VI: Métodos de Búsqueda
Retícula ISIC-2010-224: Programa: AED-1026/2016

Itsguasave.edu.mx
ESTRUCTURA DE DATOS

Competencia de la Unidad
• Conoce, comprende y aplica los algoritmos de búsqueda para el uso
adecuado en el desarrollo de aplicaciones que permita solucionar
problemas del entorno.
ESTRUCTURA DE DATOS
INTRODUCCIÓN
• Una de las funciones que con mayor frecuencia se utiliza en los
sistemas de información, es el de las consultas a los datos, se hace
necesario utilizar algoritmos, que permitan realizar búsquedas de
forma rápida y eficiente.
• La búsqueda, se puede decir que es la acción de recuperar datos o
información, siendo una de las actividades que más aplicaciones
tiene en los sistemas de información.
• Más formalmente se puede definir como “La operación de búsqueda
sobre una estructura de datos es aquella que permite localizar un
nodo en particular si es que éste existe” (Euán, 1989).
ESTRUCTURA DE DATOS
• La llave es el campo por el cual se
va a realizar la búsqueda.
Clasificación de las Búsquedas
• La búsqueda por comparación de
llaves son algoritmos bastante
sencillos, en estos se van
comparando e las llaves.

• En la transformación de llaves los


algoritmos deben de ser mucho
más analizados, ya que transforma
las llaves por varios métodos,
indicando en que posición del
arreglo o del archivo se almacenan
o se recuperan.
ESTRUCTURA DE DATOS

Búsqueda Lineal o Secuencial


ESTRUCTURA DE DATOS
BÚSQUEDA LINEAL O SECUENCIAL

• Este tipo de búsqueda consiste en examinar, a partir del primer elemento y de


uno en uno, hasta encontrar el dato buscado o bien llegar al final de la lista
que puede estar almacenada en archivo o arreglo.

• En este tipo de listas los elementos pueden o no estar ordenados, ya que se


empieza a comparar de uno en uno los elementos de la lista y no importa su
orden o lugar de ubicación para realizar la búsqueda, salvo para el tiempo de
ejecución.
ESTRUCTURA DE DATOS
• Si el elemento que se está buscando, se encuentra al inicio de la lista, este
tiempo, sería muy corto, pero si se encuentra al final, va a tardar más y si el
elemento que se desea buscar, no se encuentra en la lista, se hizo necesario,
recorrer toda la lista, para darse cuenta que no está en ella.

• Y si se le aumenta a esto, que el número de elementos en la lista puede ser del


orden de cientos o miles, va a hacer mucho más tardado su ejecución.

• Esta búsqueda tiene la ventaja de tener una fácil programación de su


algoritmo.
ESTRUCTURA DE DATOS
• Si el elemento que se está buscando, se encuentra al inicio de la lista, este
tiempo, sería muy corto, pero si se encuentra al final, va a tardar más y si el
elemento que se desea buscar, no se encuentra en la lista, se hizo necesario,
recorrer toda la lista, para darse cuenta que no está en ella.

• Y si se le aumenta a esto, que el número de elementos en la lista puede ser del


orden de cientos o miles, va a hacer mucho más tardado su ejecución.

• Esta búsqueda tiene la ventaja de tener una fácil programación de su


algoritmo.
ESTRUCTURA DE DATOS
ALGORITMO PARA BÚSQUEDA SECUENCIAL

int x, i=0 DESPLEGAR “posición: ” i


bool bandera=false bandera=true
CAPTURAR x FINSI
ABRIR (archivo) FINMIENTRAS
MIENTRAS no sea fin de archivo CERRAR (ARCHIVO)
LEER REGISTRO (ARCHIVO) SI bandera = false
INCREMENTAR i DESPLEGAR “Registro no encontrado“
SI llave = x entonces FINSI
DESPLEGAR “Registro encontrado; ”
ESTRUCTURA DE DATOS
MANEJO DE ARCHIVOS DE TEXTO EN C++

• Para poder realizar el programa es necesario primero conocer las instrucciones


y la lógica con la que se trabaja un archivo de texto.

• Un archivo de texto contiene la información guardada sin ningún formato, en


caso de requerirse un formato en particular, debe ser diseñado antes de
guardar la información.
ESTRUCTURA DE DATOS
INSTRUCCIONES PARA MANEJO DE ARCHIVOS DE TEXTO
• <stdio.h>: esta librería contiene las instrucciones para el manejo de archivos
ya sea de texto o binarios, por lo que es obligatorio incluirla en la cabecera del
programa.
• fopen(archivo, modo): esta función controla la apertura de un archivo, se
requiere asignar el resultado a una variable apuntador de tipo FILE, la cual en
caso de que el archivo no exista o por alguna razón no pueda ser abierto
regresa NULL.
Sintaxis:
FILE *archivo;
archivo=fopen(“c:\\alumnos.txt”, “w”);
If (archivo==NULL)
cout<<"El archivo no fue creado"
ESTRUCTURA DE DATOS
MODOS DE APERTURA DE UN ARCHIVO
ESTRUCTURA DE DATOS
• fputs(): Una vez que el archivo fue creado o abierto para agregar información,
podemos hacer esta acción por medio de la instrucción fputs().

Sintaxis:
fputs(char cadena, FILE archivo);

Dónde:
• Cadena: Es una variable tipo char.
• Archivo: Es una variable tipo apuntador FILE, el archivo al que apunta
debió ser abierto previamente.
ESTRUCTURA DE DATOS
• fgets(): Los archivos también pueden ser leídos, es decir su información puede
ser extraída y puesta en pantalla u otro medio de impresión por medio de la
instrucción fgets(). Esta instrucción mueve el apuntador del archivo un registro
por cada vez que se use.

Sintaxis:
fgets(char cadena, int longitud, FILE archivo);
Dónde:
• Cadena: Es una variable tipo char.
• Longitud: Es la longitud máxima de la cadena a leer, en caso de que se
encuentre un salto de línea o fin de archivo la lectura se detiene en ese
punto.
• Archivo: Es una variable apuntador de tipo FILE, el archivo al que apunta
debió ser abierto previamente.
ESTRUCTURA DE DATOS
COMPROBAR FINAL DE ARCHIVO
• feof(archivo): Cada vez que se mueve el apuntador del archivo la función
booleana feof(FILE archivo) puede ser usada, dicha función regresa true si el
fin de archivo ya fue alcanzado y false si aún no se ha encontrado.

Sintaxis:
if (feof(archivo))
cout<<“No hay mas registros en el archivo”;
ESTRUCTURA DE DATOS
CIERRE DE ARCHIVOS

• fclose(archivo): Antes de cerrar nuestro programa una vez que terminamos de


leer todos los registros, esto se hace con la instrucción fclose(archivo), el
archivo al que apunta debió ser abierto previamente para que no regrese
errores.

• Es muy importante que esta instrucción sea utilizada ya que C++ libera la
memoria y recursos utilizados para el archivo cuando encuentra esta
instrucción. Además, mientras que no sea cerrado el archivo, el sistema
operativo no lo libera, por lo que no puede ser modificado o eliminado vía
COMMAND y/o Explorador de Windows.
ESTRUCTURA DE DATOS
Ejercicio:

• Realizar un programa que genere un archivo de texto con 500 llaves


secuenciales aleatorias (no necesariamente estarán ordenadas).
• Una vez que el archivo esté creado se debe capturar un número entero
cualquiera y verificar si dicho número está contenido en el archivo utilizando el
método de búsqueda secuencial.
• Desplegar los mensajes correspondientes ya sea que se encontró la llave o que
la búsqueda no fue exitosa.

Nota: Debido a que las llaves en el archivo de texto se guardan en modo char, la
verificación requiere que dichas llaves sean convertidas a tipo int para poder
realizar comparaciones.
ESTRUCTURA DE DATOS
Trabajando con Búsquedas Secuenciales en Archivos de Texto

Variables globales Módulo main


ESTRUCTURA DE DATOS

MÓDULO PARA
CREAR ARCHIVO
DE TEXTO
ESTRUCTURA DE DATOS

MÓDULO PARA
REALIZAR LA
BÚSQUEDA
ESTRUCTURA DE DATOS

Búsqueda Binaria
ESTRUCTURA DE DATOS
BÚSQUEDA BINARIA

• La búsqueda Binaria o por Bisección no representa mucha dificultad para la


programación de su algoritmo y además, es muy rápida su ejecución.
• Este algoritmo requiere que los elementos de la lista sobre la que va a actuar
sean ordenados previamente, ya sea en forma ascendente o descendente,
cada elemento de la lista puede tener varios campos. La lista se considera que
empieza a almacenar sus elementos en la posición cero.
• Va a utilizarse tres apuntadores, uno en la primera posición de la lista que se le
denominara LI, para efectos de la explicación, otro en la última conocido como
LS y el que apunte en la parte central, el cual se obtiene de la suma de LS mas
LI entre dos (LI + LS/ 2) y tomando la parte entera, el cual se le llamará M.
ESTRUCTURA DE DATOS
A diferencia de la Búsqueda Secuencial, aquí el número de comparaciones no se
comporta en forma lineal, ya que procede a realizar los siguientes pasos:
• Dividir la lista en dos partes, al determinar el elemento central de dicha lista,
con lo que se iniciará el apuntador M.
• Comparar el valor del elemento buscado con el central.
• Si resultan ser iguales, las búsquedas termina con éxito, indicando en qué
posición se encontró y cuáles son los datos que están en esa posición.
• En el caso de no ser iguales, se redefinen la posición de alguno de los
apuntadores de los extremos (LI o LS), dependiendo del valor del elemento
central, sea mayor o menor que el buscado.
ESTRUCTURA DE DATOS
• Ejemplo: se cuenta con un arreglo ordenado de 8 posiciones, se desea buscar
la ubicación del número 17. Aplicar el método de búsqueda binario.

LI=0 M=3 LS=7

Asignamos posiciones a LI, LS y M


LI=0; LS=tamaño-1  LS=7; M=(0+7)/2  M=3;
Comparamos si el número buscado es igual al valor en la posición M, de ser así
el proceso termina; SINO
Si el número en la posición M es menor LS=M-1; SINO
Si el número en la posición M es may*or LI=M+1
El número 17 es mayor, LI=4; Se repite el proceso
ESTRUCTURA DE DATOS
• Tomamos el arreglo completo y reasignamos posiciones a los límites

LI=4 M=5 LS=7

Asignamos posiciones LI, LS y M


LI=4; LS=7; M=(4+7)/2  M=5;
Comparamos si el número buscado es igual al valor en la posición M, de ser así
el proceso termina; SINO
Si el número en la posición M es menor LS=M-1; SINO
Si el número en la posición M es mayor LI=M+1
El número 17 es mayor, LI=6; Se repite el proceso
ESTRUCTURA DE DATOS
• Tomamos el arreglo completo y reasignamos posiciones a los límites

LI=6 LS=7
M=6
Asignamos posiciones a LI, LS y M
LI=6; LS=7; M=(6+7)/2  M=6;

Comparamos si el número buscado es igual al valor en la posición M,


de ser así el proceso termina;
ESTRUCTURA DE DATOS
CODIFICACIÓN DE BÚSQUEDA BINARIA EN C++ USANDO ARREGLOS

 Variables globales

 Módulo main
ESTRUCTURA DE DATOS

 Módulo de Búsqueda
Binaria
ESTRUCTURA DE DATOS

• Ejercicio: Realice la programación del método de búsqueda binaria usando


arreglos y basándose en el código visto en clase.
• Entregar el programa ya funcionando y probado.
ESTRUCTURA DE DATOS

TRANSFORMACIÓN DE LLAVES
O TABLAS DE HASH
ESTRUCTURA DE DATOS
BÚSQUEDA MEDIANTE TRANSFORMACIÓN DE CLAVES (HASHING)

• Es un método de búsqueda que aumenta la velocidad de búsqueda, pero que


no requiere que los elementos estén ordenados.
• Consiste en asignar a cada elemento un índice mediante una transformación
del elemento. Esta correspondencia se realiza mediante una función de
conversión, llamada función hash.
• La correspondencia más sencilla es la identidad, esto es, al número 0 se le
asigna el índice 0, al elemento 1 el índice 1, y así sucesivamente.
• Pero si los números a almacenar son demasiado grandes esta función es
inservible.
ESTRUCTURA DE DATOS
• Por ejemplo, se quiere guardar en un array la información de los 1000 usuarios
de una empresa, y se elige el número llave como elemento identificador.
• Es inviable hacer un array de 100.000.000 elementos, sobre todo porque se
desaprovecha demasiado espacio.
• Por eso, se realiza una transformación al número de llave para que nos de un
número menor, por ejemplo tomar las 3 últimas cifras para guardar a los
empleados en un array de 1000 elementos.
• Para buscar a uno de ellos, bastaría con realizar la transformación a su DNI y
ver si está o no en el array.
• La función de hash ideal debería ser biyectiva, esto es, que a cada elemento le
corresponda un índice, y que a cada índice le corresponda un elemento, pero
no siempre es fácil encontrar esa función, e incluso a veces es inútil, ya que
puedes no saber el número de elementos a almacenar.
ESTRUCTURA DE DATOS
• Restas sucesivas: esta función se emplea con claves numéricas entre las que
existen huecos de tamaño conocido, obteniéndose direcciones consecutivas.
• Por ejemplo, si el número de expediente de un alumno universitario está
formado por el año de entrada en la universidad, seguido de un número
identificativo de tres cifras, y suponiendo que entran un máximo de 1000
alumnos al año, se le asignarían las claves:

Clave 1998-000  0 = 1998000-1998000; el consecutivo es 000


Clave 1998-457  457 = 1998457-1998000; el consecutivo es 457
Clave 1998-970  970 = 1998970-1998000; el consecutivo es 970
ESTRUCTURA DE DATOS
Tarea: Existen otras formas de determinar la posición de la clave en el arreglo,
como lo son las siguientes:

• Aritmética modular
• Mitad del cuadrado
• Truncamiento
• Plegamiento
• Tratamiento de colisiones

Investigar sobre los métodos mencionados arriba y entregar resumen escrito


ESTRUCTURA DE DATOS
TRABAJANDO CON TABLAS HASH CON EL MÉTODO DE RESTAS SUCESIVAS

• Una tabla hash está compuesta por al menos dos elementos que forman una
pareja, la llave, y la información que contiene relacionada.
• Una función hash es método para generar claves o llaves que representen de
manera casi única a un documento o conjunto de datos. Es una operación
matemática que se realiza sobre este conjunto de datos de cualquier longitud,
y su salida es una huella digital, de tamaño fijo e independiente de la
dimensión del conjunto de datos originales.
• La tabla hash usa una función de dispersión para colocar los elementos, de
forma que no se pueden recorrer secuencialmente, pero a cambio el acceso a
partir de la clave es muy rápido, más que si hacemos una búsqueda secuencial
o binaria.
ESTRUCTURA DE DATOS
Ejercicio:

• Realice un programa utilizando Tablas Hash y el método de Restas Sucesivas.


Dicho programa debe capturar llave y nombre del estudiante.
• Se tomará como base para generar la llave el año 2016 y el máximo de
alumnos a capturar es de 1000 (desde consecutivo 000 al consecutivo 999).
• El programa debe permitir, Insertar, Eliminar, Verificar Posición, y Realizar
Recorrido del arreglo que contiene la información.
ESTRUCTURA DE DATOS

VARIABLES
GLOBALES

MÓDULO PARA
INICIAR ARREGLOS
ESTRUCTURA DE DATOS
MÓDULO PARA
CALCULAR POSICION
EN LA TABLA HASH

MÓDULO PARA RECORRAR


LA TABLA HASH
ESTRUCTURA DE DATOS

MÓDULO PARA INSERTAR


EN LA TABLA HASH

MÓDULO PARA ELIMINAR


EN LA TABLA HASH
ESTRUCTURA DE DATOS

MAIN
MÓDULO
ESTRUCTURA DE DATOS
Proyecto final: Realice una aplicación con las siguientes características:
• Debe cargar un archivo de texto en donde cada línea contiene un número entero al
azar (100 líneas), cada línea se carga en un arreglo con el mismo número de
elementos.
• Una vez cargado en el arreglo se debe formar un árbol binario en el cual todos los
elementos menores a la raíz forman el subárbol izquierdo y todos los elementos
mayores o iguales a la raíz forman el subárbol derecho.
• Aplicar al árbol binario el método de acceso “inorden” y conforme se va visitando la
cada raíz se debe insertar el elemento contenido en cada nodo en un segundo
arreglo.
• Aplicar al primer arreglo un método de ordenamiento como los vistos en clase.
• Desplegar ambos arreglos para corroborar que ambos están ordenados e iguales.
• Aplicar un método de búsqueda como los vistos en clase sobre el primer arreglo.
ESTRUCTURA DE DATOS
Bibliografía

• Joyanes, Zahonero. Estructura de Datos en C++. McGraw Hill. Madrid, España.


2007. ISBN: 978-84-481-5645-9.
• EUÁN AVILA JORGE IVAN Y CORDERO BORBOA LUIS GONZAGA., Estructuras de
datos, (1ª reimpresión.), MÉXICO, LIMUSA, tomada de la primera edición de la
UNAM (FACULTAD DE INGENIERÍA), 1989.