You are on page 1of 4

BUSQUEDA POR TRANSFORMACION DE

CLAVES
BSQUEDA POR TRANSFORMACIN DE LLAVES (HASHING)
Supongase que tiene una coleccin de datos cada uno de ellos identificado por
una clave. Es claro que resulta atractivo poder tener acceso a ellos de manera
directa.
El mtodo por transformacin de llaves permite esto. Trabaja basndose en
una funcin de transformacin o funcin Hash (H) que convierte una clave
dada en una direccin (indice) dentro del arreglo.
Direccin<-H(clave)
Tipos de funciones Funcin modulo(residuo)
H(k)=Kmod N +1
Ejemplo:
Sea N=100 el tamao del arreglo y sean sus direcciones los nmeros entre 1 y
100.
Sean k1=7259 y k2=9357 dos claves a las que deban asignarse posiciones en
el arreglo.
H(k1)=7259 mod 100 +1 =60
H(k2)=9359 mod 100 +1 =60
Solucin a la colisin.
Aplicar funcin de reasignacin rh(I) donde I es la direccin colisionado:
rh(i)=(I+1) mod 100
rh(i)=(60+1) mod 100 =61
La funcin Hash aplicada a la clave da un indice del arreglo, lo que permite
acceder directamente sus elementos.
Para trabajar con el mtodo de bsqueda debe elegirse previamente:
1. Una funcin Hash que sea fcil de calcular y que distribuya uniformemente
las claves.
2. Un metodo para resolver colisiones. Si estas se presentan se debe contar
con algn metodo que genere posiciones alternas.
Ejemplo:
Posicin

Llave

Registro

0
1
2
3
.
.

4967000
.
8421002
.
.
.

itutjgdh
.
bsoedsj
.
.
.

396

4697997

naidedheh

i=h(llave)
I= (l(lave).mod(1000))
Ejercicio
Disear una funcin que terno solo un valor, que reciba como parmetro una
llave a buscar, un vector, una variable N (que indica el ltimo elemento del
vector) y que retorne la posicin donde se inserto la llame, tome en vuenta lo
siguiente:
* Que el vector empieza en el indice 0.
* Que hay que usar una funcin de randomizacin (Hash) y una de reasignacin.
* Que hay que detectar cuando ya se recorrio todo el vector y no se encontro
lugar.
* Las llaves son de 7 digitos.
Hash(Llave, vector, N)
1. i=(llave)mod(1000)
2. ban=1
3. Si (vector(i)="NULL")
Entonces Retornar i
Si no:
3.1 Si (ban==i)
entonces Hash(i+1), vector, N)
si no Retornar -1
4. {Fin del condicional 3}
FUNCIN CUADRADO
Consiste en elevar al cuadrado la clave y tomar los digitos centrales como
direccin. El nmero de digitos a tomar queda determinado por el rango del
indice.
Sea K la clave del dato a buscar.

H(k)=digitos_centrales(k^2)+1
La suma de una unidad a los digitos centrales es para obtener un valor entre 1
y N.
Ejemplo: Sea N=100 el tamao del arreglo y sus direcciones entre 1 y 100
Sea K1= 7259 Dos claves a los que deben asignarse posiciones en el arreglo.
Sea K2=9359
K1 al cuadrado = 52693081
K2 al cuadrado= 87590881
Por lo tanto: H(K1)=digitos_centrales (52 693 081) +1= 94
H(K2)=digitos_centrales ( 87 590 881) +1= 91
EN CASO DE COLISIONES
Prueba lineal
Consiste en que una vez detectada la colisin se debe recorre el vector
secuencialmente a partir del punto de deteccin hasta el elemento.
El proceso de bsqueda concluye cuando el elemento es hallado o cuando se
encuentra una posicin vacia. Se trata al arreglo como una estructura circular.
El siguiente elemento despus del ultimo es el primero.
Prueba_Lineal (V, N, K) {El algoritmo busca el dato con clave K en el
arreglo V de N elementos, resuelve el problema de colisiones por medio de l
prueba lineal} {D, DX son variables de tipo entero}
1. Hacer D<--H(k) {Genera Direccin}
2. 2. Si V(D).Clave=k
Entonces: Escribir "El elemento esta en la posicin D"
Si no: Hacer DX<--D+1
2.1 Hacer Mientras (V[DX].clave=k) y (V[DX]=vacio) y (DX=D)
Hacer DX<--DX+1
2.1.1 Si DX=N+1 entonces:
Hacer DX<--1
2.1.2 {Fin del condicional del paso 2.1.1}
2.2 {Fin del ciclo del paso 2.1}
2.3 Si V[DX].clave=k
Entonces: Escribir: "El elemento esta en la posicin DX"
Si no: Escribir ""El elemento no esta en el arreglo"
2.4 {Fin del condicional del paso 2.3}
3. {Fin del condicional del paso 2}
ENCADENAMIENTO

Consiste en que cada elemento del arreglo tenga un apuntador a una lista
ligada, la cual se ir generando e ira almacenando los valores colisionados am
edida que se requiera. Es el mtodo ms eficiente debido al dinamismo propio
de las listas.
Encadenamiento (V, N, K) {Este algoritmo busca el dato con clave V de N
elementos. Resuelve el problema de las colisiones por medio de
encadenamiento} {D es una variable de tipo entero Q es una variable de tipo
apuntador}
1. Hacer D<--H(k)
2. Si V[D].clave=k
Entonces: Escribir "El elemento esta en la posicin D"
Si no: Hacer Q<--V[D].sig
a. Hacer mientras (Q=vacio) y (Q.clave=k)
Hacer Q<--Q.liga
b. {Fin del ciclo del paso 2.1}
c. Si Q=vacio
i. Entonces: Escribir "El elemento no esta en la lista"
ii. Si no: Escribir "El elemento si esta en la lista"
d. {Fin del condicional del paso 2.3}
3. {Fin del condicional del paso 2}

You might also like