Busqueda Hash

download Busqueda Hash

of 5

Transcript of Busqueda Hash

  • 8/17/2019 Busqueda Hash

    1/5

    Introducción

    La búsqueda binaria proporciona un medio para reducir el tiempo requeridopara buscar en una lista. Este método, sin embargo, exige que los datosestén ordenados y siempre depende del número n de elementos queconforman el conjunto de datos.

    Surge entonces una pregunta, es posible lograr una búsqueda de !"#$%, es

    decir, una búsqueda que tome el mismo tiempo para buscar cualquierelemento de una lista. La respuesta es s&. 'ara ello se utili(a la técnica)as)ing.Este método se conoce como transformación de cla*es "cla*e+dirección$ y consiste en con*ertir el elemento almacenado "numérico oalfanumérico$ en una dirección "&ndice$ dentro de un arreglo, de manera quese puede acceder al elemento directamente.Ejemplo.

    amos a partir de un sencillo ejemplo. Supongamos que tenemos una listade empleados de una peque-a empresa. ada empleado tiene asignado unnúmero de identi/cación de 0 )asta 11. Entonces se necesitar&a un *ectorde tama-o /jo de #00 posiciones para almacenar los empleados. 2)ora,podr&amos tener una relación directa entre el *alor cla*e de cada empleadocon el &ndice del arreglo. 2s&3

    4e esta forma es posible acceder directamente a la información de cadaempleado conociendo el número de identi/cación de cada empleado. 'orejemplo, si se quiere acceder al empleado con identi/cación 5, simplementese utili(ar&a la instrucción3 arreglo657.Sin embargo, )acer esta correspondencia en la pr8ctica no es posible, yaque generalmente los números de identi/cación son números largos comoes el caso de los números de cédula. Entonces, no ser&a posible crear unarreglo tan grande para contener tal cantidad de elementos.

    9ué alternati*a entonces existe%:na alternati*a sencilla para no crear arreglos enormes, ser&a usar los dosúltimos campos del campo cla*e. 'or ejemplo, en el caso de la cédulautili(ar los dos últimos campos. 2s& pues, si la cédula es 1;515, estacédula se almacenar&a en el arreglo en la posición =>.

    'ara ello, se necesita tener una función )as), que determine, a partir delcampo cla*e, en qué posición del arreglo estar8 cada objeto. La función)as), determinar8 el método de acceso al arreglo.En este caso, la función )as) aplicar8 la operación3 L2 E ?!4 #00. 2s& porejemplo, si la cla*e es 1;515, la función )as) de*ol*er8 que se debeacceder a la posición > "1;515 ?!4 #00 @ >$.

    4e la siguiente manera3

  • 8/17/2019 Busqueda Hash

    2/5

    2 continuación se da el código fuente en ja*a de cómo ser&a la función )as)3public int funcionAas)"int cla*e$B return cla*eC#00D

    El problema de esta técnica son las colisiones, lo cual se explica acontinuación.

    olisiones

    El esquema explicado anteriormente de la función )as), no garanti(adirecciones únicas "colisiones$. 'or ejemplo, para las cla*es 1;515 y=F, la función )as) arrojar&a la misma posición3 >.

    Las colisiones son imposibles de e*itar, lo que se debe tener en cuenta esque una buena función )as), debe minimi(ar las colisiones extendiendo losregistros uniformemente a tra*és de la tabla.

    Existen *arias alternati*as para manejar las colisiones. Las cuales seexplican a continuación.

    ?étodo #3 Aas)ing y búsqueda

    Esta técnica es sencilla, consiste en almacenar cada elemento colisionadoen el siguiente espacio disponible. 'or ejemplo, si queremos almacenarnue*o registro con la cla*e 5FF=0

  • 8/17/2019 Busqueda Hash

    3/5

    'ara buscar un elemento con esta técnica, se aplica la función )as) sobre lacla*e, luego se compara la cla*e de*uelta con la cla*e real. Si las cla*es nocoinciden, se )ace una búsqueda secuencial comen(ando por la siguienteposición del array. Hue*amente, si se llega al /nal del *ector, se siguebuscando desde el principio.

    ?étodo

  • 8/17/2019 Busqueda Hash

    4/5

    Si A es una función )as) y es un elemento a almacenar, entonces A" $ esla función )as) del elemento y se corresponde con el &ndice donde se debecolocar . En nuestro ejemplo, la función )as) ser&a A" $@ C K5 "funciónresto$. Los *alores generados por A deben cubrir todo el conjunto de &ndices de latabla. 2dem8s, el tama-o de la tabla debe ser un poco m8s grande que elnúmero de elementos que )an de ser insertados, aunque queden posiciones

    de la tabla sin uso. El método anterior tiene una de/ciencia3 suponer que dos elementos e Mson tales que A" $ @ A"M$. Entonces, cuando un el elemento entra en latabla, éste se inserta en la posición dada por su función Aas), A" $. 'erocuando al elemento M le es asignado su posición donde ser8 insertadomediante la función )as), resulta que la posición que se obtiene es lamisma que la del elemento . Esta situación se denomina colisión o c)oque. :na buena función Aas) ser8 aquella que minimi(a las colisiones, y quedistribuya los elementos uniformemente a tra*és del arreglo. Esta es lara(ón por la que el tama-o del arreglo debe ser un poco mayor que elnúmero real de elementos a insertar, pues cuanto m8s grande sea el rangode la función de randomi(ación, es menos probable que dos cla*es generenel mismo *alor de asignación o )as), es decir, que se asigne una mismaposición a m8s de un elemento. Aabr8 que llegar a un compromiso entre E/ciencia en Espacio+Niempo3 eldejar espacios *ac&os en la tabla es una de/ciencia en cuanto a espacio,mientras que reduce la necesidad de resol*er los casos de c)oque en laasignación, y por lo tanto es m8s e/ciente en términos de tiempo.

    :na solución al problema de las colisiones3 Oona de desbordamiento.

    Se trata de mantener una (ona reser*ada para aquellos elementos quellegan a colisionar, de manera que cuando se produ(ca una colisión elelemento se *a a locali(ar en esta (ona de desbordamiento. 2l reali(ar la búsqueda y comprobar si el elemento buscado est8 en laposición dada por su tabla )as), si esa posición ya est8 ocupada por otroelemento con el mismo *alor de )as)ing, se seguir8 buscando a partir del

    inicio de la (ona de desbordamiento de manera secuencial, )asta encontrarel elemento o llegar al /nal de dic)a (ona de desbordamiento. Siguiendo con el ejemplo, para cada código se obten&a el residuo "resto$ desu di*isión por un número primo "en este caso el K5$. Es recomendable usarnúmeros primos ya que que reduce la probabilidad de colisión al establecerfunciones del tipo3 A" $ @ " C primo$ 2)ora bien, cu8l *alor primo escoger% En este ejemplo se manejan 50códigos, de modo que ese *alor debe ser superior a 50, y que su magnitudse acerque al doble de elementos, por ello una buena opción era el K5 "otambién el F#$. alores primos muy cercanos a la cantidad original de datosda lugar a demasiadas colisiones y un *alor primo grande "por ejemplo, 1=$da lugar a un considerable desperdicio de espacio "casillas *ac&as$.

  • 8/17/2019 Busqueda Hash

    5/5

    ómo nos quedar&an ubicados los elementos en el *ector% Aay que tener

    en cuenta algo m8s3 como el *alor primo utili(ado en la función de Aas)ingfue el K5, inicialmente el *ector destino tendr&a K5 casillas, pero a eso )ayque agregarle las casillas de la (ona de desbordamiento, de modo que)abr&a que aumentar esas casillas alrededor de un