Top Banner
Ingeniería en Sistemas Computacionales Estructura de Datos Unidad VI: Métodos de Búsqueda
41

Estructura de Datos - Unidad 6 Metodos de busqueda

Jan 21, 2018

Download

Engineering

Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Estructura de Datos - Unidad 6 Metodos de busqueda

Ingeniería en Sistemas ComputacionalesEstructura de Datos

Unidad VI: Métodos de Búsqueda

Page 2: Estructura de Datos - Unidad 6 Metodos de busqueda

Competencia de la Unidad

• Aplicar el método de búsqueda pertinente en la solución de un problema real.

Temario

Page 3: Estructura de Datos - Unidad 6 Metodos de busqueda

INTRODUCCIÓN

• Una de las funciones que con mayor frecuencia se utiliza en lossistemas de información, es el de las consultas a los datos, se hacenecesario utilizar algoritmos, que permitan realizar búsquedas deforma rápida y eficiente.

• La búsqueda, se puede decir que es la acción de recuperar datos oinformación, siendo una de las actividades que más aplicacionestiene en los sistemas de información.

• Más formalmente se puede definir como “La operación de búsquedasobre una estructura de datos es aquella que permite localizar unnodo en particular si es que éste existe” (Euán, 1989).

Page 4: Estructura de Datos - Unidad 6 Metodos de busqueda

Clasificación de las Búsquedas

•La llave es el campo por el cualse va a realizar la búsqueda. Labúsqueda por comparación dellaves son algoritmos bastantesencillos, en estos se vancomparando e las llaves.•En la transformación de llaveslos algoritmos deben de sermucho más analizados, ya quetransforma las llaves por variosmétodos, indicando en queposición del arreglo o delarchivo se almacenan o serecuperan.

Page 5: Estructura de Datos - Unidad 6 Metodos de busqueda

Búsqueda Lineal o Secuencial

Page 6: Estructura de Datos - Unidad 6 Metodos de busqueda

BÚSQUEDA LINEAL O SECUENCIAL

• Este tipo de búsqueda consiste en examinar, a partir del primer elemento y deuno en uno, hasta encontrar el dato buscado o bien llegar al final de la listaque puede estar almacenada en archivo o arreglo.

• En este tipo de listas los elementos pueden o no estar ordenados, ya que seempieza a comparar de uno en uno los elementos de la lista y no importa suorden o lugar de ubicación para realizar la búsqueda, salvo para el tiempo deejecución.

Page 7: Estructura de Datos - Unidad 6 Metodos de busqueda

• Si el elemento que se está buscando, se encuentra al inicio de la lista, estetiempo, sería muy corto, pero si se encuentra al final, va a tardar más y si elelemento 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 delorden 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 sualgoritmo.

Page 8: Estructura de Datos - Unidad 6 Metodos de busqueda

• Si el elemento que se está buscando, se encuentra al inicio de la lista, estetiempo, sería muy corto, pero si se encuentra al final, va a tardar más y si elelemento 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 delorden 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 sualgoritmo.

Page 9: Estructura de Datos - Unidad 6 Metodos de busqueda

ALGORITMO PARA BÚSQUEDA SECUENCIAL

int x, i=0

bool bandera=false

CAPTURAR x

ABRIR (archivo)

MIENTRAS no sea fin de archivo

LEER REGISTRO (ARCHIVO)

INCREMENTAR i

SI llave = x entonces

DESPLEGAR “Registro encontrado; ”

DESPLEGAR “posición: ” i

bandera=true

FINSI

FINMIENTRAS

CERRAR (ARCHIVO)

SI bandera = false

DESPLEGAR “Registro no encontrado“

FINSI

Page 10: Estructura de Datos - Unidad 6 Metodos de busqueda

MANEJO DE ARCHIVOS DE TEXTO EN C++

• Para poder realizar el programa es necesario primero conocer las instruccionesy 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, encaso de requerirse un formato en particular, debe ser diseñado antes deguardar la información.

Page 11: Estructura de Datos - Unidad 6 Metodos de busqueda

INSTRUCCIONES PARA MANEJO DE ARCHIVOS DE TEXTO

• <stdio.h>: esta librería contiene las instrucciones para el manejo de archivosya sea de texto o binarios, por lo que es obligatorio incluirla en la cabecera delprograma.

• fopen(archivo, modo): esta función controla la apertura de un archivo, serequiere asignar el resultado a una variable apuntador de tipo FILE, la cual encaso de que el archivo no exista o por alguna razón no pueda ser abiertoregresa NULL.

Sintaxis:

FILE *archivo;

archivo=fopen(“c:\\alumnos.txt”, “w”);

If (archivo==NULL)

cout<<"El archivo no fue creado"

Page 12: Estructura de Datos - Unidad 6 Metodos de busqueda

MODOS DE APERTURA DE UN ARCHIVO

Page 13: Estructura de Datos - Unidad 6 Metodos de busqueda

• 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 apuntadebió ser abierto previamente.

Page 14: Estructura de Datos - Unidad 6 Metodos de busqueda

• fgets(): Los archivos también pueden ser leídos, es decir su información puedeser extraída y puesta en pantalla u otro medio de impresión por medio de lainstrucción fgets(). Esta instrucción mueve el apuntador del archivo un registropor 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 seencuentre un salto de línea o fin de archivo la lectura se detiene en esepunto.

• Archivo: Es una variable apuntador de tipo FILE, el archivo al que apuntadebió ser abierto previamente.

Page 15: Estructura de Datos - Unidad 6 Metodos de busqueda

COMPROBAR FINAL DE ARCHIVO

• feof(archivo): Cada vez que se mueve el apuntador del archivo la funciónbooleana feof(FILE archivo) puede ser usada, dicha función regresa true si elfin 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”;

Page 16: Estructura de Datos - Unidad 6 Metodos de busqueda

CIERRE DE ARCHIVOS

• fclose(archivo): Antes de cerrar nuestro programa una vez que terminamos deleer todos los registros, esto se hace con la instrucción fclose(archivo), elarchivo al que apunta debió ser abierto previamente para que no regreseerrores.

• Es muy importante que esta instrucción sea utilizada ya que C++ libera lamemoria y recursos utilizados para el archivo cuando encuentra estainstrucción. Además, mientras que no sea cerrado el archivo, el sistemaoperativo no lo libera, por lo que no puede ser modificado o eliminado víaCOMMAND y/o Explorador de Windows.

Page 17: Estructura de Datos - Unidad 6 Metodos de busqueda

Ejercicio:

• Realizar un programa que genere un archivo de texto con 500 llavessecuenciales aleatorias (no necesariamente estarán ordenadas).

• Una vez que el archivo esté creado se debe capturar un número enterocualquiera y verificar si dicho número está contenido en el archivo utilizando elmétodo de búsqueda secuencial.

• Desplegar los mensajes correspondientes ya sea que se encontró la llave o quela búsqueda no fue exitosa.

Nota: Debido a que las llaves en el archivo de texto se guardan en modo char, laverificación requiere que dichas llaves sean convertidas a tipo int para poderrealizar comparaciones.

Page 18: Estructura de Datos - Unidad 6 Metodos de busqueda

Trabajando con Búsquedas Secuenciales en Archivos de Texto

Variables globales Módulo main

Page 19: Estructura de Datos - Unidad 6 Metodos de busqueda

MÓDULO PARA CREAR ARCHIVO

DE TEXTO

Page 20: Estructura de Datos - Unidad 6 Metodos de busqueda

MÓDULO PARA REALIZAR LA BÚSQUEDA

Page 21: Estructura de Datos - Unidad 6 Metodos de busqueda

Búsqueda Binaria

Page 22: Estructura de Datos - Unidad 6 Metodos de busqueda

BÚSQUEDA BINARIA

• La búsqueda Binaria o por Bisección no representa mucha dificultad para laprogramació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 actuarsean ordenados previamente, ya sea en forma ascendente o descendente,cada elemento de la lista puede tener varios campos. La lista se considera queempieza 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.

Page 23: Estructura de Datos - Unidad 6 Metodos de busqueda

A diferencia de la Búsqueda Secuencial, aquí el número de comparaciones no secomporta 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 losapuntadores de los extremos (LI o LS), dependiendo del valor del elementocentral, sea mayor o menor que el buscado.

Page 24: Estructura de Datos - Unidad 6 Metodos de busqueda

• Ejemplo: se cuenta con un arreglo ordenado de 8 posiciones, se desea buscarla ubicación del número 17. Aplicar el método de búsqueda binario.

Asignamos posiciones a LI, LS y M

LI=0; LS=tamaño-1 LS=7; M=(0+7)/2M=3;

LI=0 LS=7M=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 mayor LI=M+1

El número 17 es mayor, LI=4; Se repite el proceso

Page 25: Estructura de Datos - Unidad 6 Metodos de busqueda

• Tomamos el arreglo completo y reasignamos posiciones a los límites

Asignamos posiciones LI, LS y M

LI=4; LS=7; M=(4+7)/2M=5;

LI=4 LS=7M=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

Page 26: Estructura de Datos - Unidad 6 Metodos de busqueda

• Tomamos el arreglo completo y reasignamos posiciones a los límites

Asignamos posiciones a LI, LS y M

LI=6; LS=7; M=(6+7)/2M=6;

LI=6 LS=7

M=6

Comparamos si el número buscado es igual al valor en la posición M,de ser así el proceso termina;

Page 27: Estructura de Datos - Unidad 6 Metodos de busqueda

CODIFICACIÓN DE BÚSQUEDA BINARIA EN C++ USANDO ARREGLOS

Variables globales

Módulo main

Page 28: Estructura de Datos - Unidad 6 Metodos de busqueda

Módulo de Búsqueda Binaria

Page 29: Estructura de Datos - Unidad 6 Metodos de busqueda

• Ejercicio: Realice la programación del método de búsqueda binaria usandoarreglos y basándose en el código visto en clase.

• Entregar el programa ya funcionando y probado.

Page 30: Estructura de Datos - Unidad 6 Metodos de busqueda

TRANSFORMACIÓN DE LLAVES O TABLAS DE HASH

Page 31: Estructura de Datos - Unidad 6 Metodos de busqueda

BÚSQUEDA MEDIANTE TRANSFORMACIÓN DE CLAVES (HASHING)

• Es un método de búsqueda que aumenta la velocidad de búsqueda, pero queno requiere que los elementos estén ordenados.

• Consiste en asignar a cada elemento un índice mediante una transformacióndel elemento. Esta correspondencia se realiza mediante una función deconversión, llamada función hash.

• La correspondencia más sencilla es la identidad, esto es, al número 0 se leasigna 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 esinservible.

Page 32: Estructura de Datos - Unidad 6 Metodos de busqueda

• Por ejemplo, se quiere guardar en un array la información de los 1000 usuariosde 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 sedesaprovecha demasiado espacio.

• Por eso, se realiza una transformación al número de llave para que nos de unnúmero menor, por ejemplo coger las 3 últimas cifras para guardar a losempleados en un array de 1000 elementos.

• Para buscar a uno de ellos, bastaría con realizar la transformación a su DNI yver si está o no en el array.

• La función de hash ideal debería ser biyectiva, esto es, que a cada elemento lecorresponda un índice, y que a cada índice le corresponda un elemento, perono siempre es fácil encontrar esa función, e incluso a veces es inútil, ya quepuedes no saber el número de elementos a almacenar.

Page 33: Estructura de Datos - Unidad 6 Metodos de busqueda

• Restas sucesivas: esta función se emplea con claves numéricas entre las queexisten 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úmeroidentificativo de tres cifras, y suponiendo que entran un máximo de 1000alumnos 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

Page 34: Estructura de Datos - Unidad 6 Metodos de busqueda

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

Page 35: Estructura de Datos - Unidad 6 Metodos de busqueda

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

• Una tabla hash está compuesta por al menos dos elementos que forman unapareja, la llave, y la información que contiene relacionada.

• Una función hash es método para generar claves o llaves que representen demanera casi única a un documento o conjunto de datos. Es una operaciónmatemá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 ladimensión del conjunto de datos originales.

• La tabla hash usa una función de dispersión para colocar los elementos, deforma que no se pueden recorrer secuencialmente, pero a cambio el acceso apartir de la clave es muy rápido, más que si hacemos una búsqueda secuencialo binaria.

Page 36: Estructura de Datos - Unidad 6 Metodos de busqueda

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 dealumnos a capturar es de 1000 (desde consecutivo 000 al consecutivo 999).

• El programa debe permitir, Insertar, Eliminar, Verificar Posición, y RealizarRecorrido del arreglo que contiene la información.

Page 37: Estructura de Datos - Unidad 6 Metodos de busqueda

MÓDULO PARA INICIAR ARREGLOS

VARIABLES GLOBALES

Page 38: Estructura de Datos - Unidad 6 Metodos de busqueda

MÓDULO PARA CALCULAR POSICION EN LA TABLA HASH

MÓDULO PARA RECORRAR LA TABLA HASH

Page 39: Estructura de Datos - Unidad 6 Metodos de busqueda

MÓDULO PARA INSERTAR EN LA TABLA HASH

MÓDULO PARA ELIMINAR EN LA TABLA HASH

Page 40: Estructura de Datos - Unidad 6 Metodos de busqueda

MÓDULO MAIN

ESTR

UC

TUR

A D

E D

ATO

S

Page 41: Estructura de Datos - Unidad 6 Metodos de busqueda

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 dedatos, (1ª reimpresión.), MÉXICO, LIMUSA, tomada de la primera edición de laUNAM (FACULTAD DE INGENIERÍA), 1989.