Está en la página 1de 19

UNIVERSIDAD TECNOLGICA DE PANAM

FACULTAD DE INGENIERA DE SISTEMAS COMPUTACIONALES




DESARROLLO DE SOFTWARE


ESTRUCTURA DE DATOS II


Eficiencia de algoritmos de bsqueda y ordenamiento

Profesora: Doris Cueto

Integrantes
Franklin Maestre 8-887-1788
Jos Gutirrez 8-872-2166
Israel Quintero 8-890-844

Grupo: 1LS121


Fecha: 16-06-2014

ndice
Introduccin ........................................................................................................................................ 3
1. Consideraciones de eficiencia de los algoritmos de ordenamiento y bsquedas. Notacin de la
Gran O (Big O). .................................................................................................................................... 4
2. Comparacin de la eficiencia de los algoritmos de ordenamientos: Seleccin, Insercin y
Burbuja. ............................................................................................................................................... 5
3. Algoritmos de ordenamiento y su eficiencia Quicksort .................................................................. 6
4. Algoritmos de ordenamiento y su eficiencia Heapsort ................................................................... 6
5. Comparacin de la eficiencia de los algoritmos de bsqueda Secuencial y Binaria ....................... 7
6. Algoritmo de bsqueda y su eficiencia de cadena Knuth-Morris-Pratt .......................................... 9
7. Algoritmo de Boyer-Moore, bsqueda de patrones ..................................................................... 10
8. Tcnicas de clculo de direcciones y comparaciones Hashing ..................................................... 13
9. MTODOS PARA RESOLVER EL PROBLEMA DE LAS COLISIONES ................................................... 16
Conclusin ......................................................................................................................................... 19











Introduccin
Una de las tareas que realizan ms frecuentemente las computadoras en el
procesamiento de datos es la ordenacin y bsqueda.
El estudio de diferentes mtodos de ordenacin es una tarea intrnsecamente
interesante desde un punto de vista terico y, naturalmente, prctico.
La ordenacin es una operacin consistente en disponer un conjunto de datos en
algn determinado orden con respecto a uno de los campos de elementos del
conjunto. La Bsqueda es una operacin que consiste en recuperar un dato
deseado.
Para estas operaciones existen numeroso algoritmos cada uno creado para una
tarea especfica en este trabajo analizaremos los algoritmos de ordenamiento de
Seleccin, Burbuja, Insercin, Quicksort y Heapsort y algoritmos de bsqueda
Secuencial, Binaria, cadena Knuth-Morris-Pratt y cadena Boyer-Moore
1. Consideraciones de eficiencia de los algoritmos de
ordenamiento y bsquedas. Notacin de la Gran O (Big O).
A) Algoritmos de ordenamiento: es una operacin consistente en disponer un
conjunto estructura de datos en algn determinado orden con respecto a uno de
los campos de elementos del conjunto.

Una coleccin de datos (estructura) puede ser almacenada en un archivo, un array
(vector o tabla), un array de registros, una lista enlazada o un rbol. Cuando los
datos estn almacenados en un array, una lista enlazada o un rbol, se denomina
ordenacin interna.

La eficiencia es el factor que mide la calidad y rendimiento de un algoritmo. En el
caso de la operacin de ordenacin, dos criterios se suelen seguir a la hora de
decidir qu algoritmo de entre los que resuelven la ordenacin es el ms eficiente:

1) tiempo menor de ejecucin en computadora.
2) menor nmero de instrucciones.

Sin embargo, no siempre es fcil efectuar estas medidas: puede no disponerse de
instrucciones para medida de tiempo aunque no sea ste el caso del lenguaje C,
y las instrucciones pueden variar, dependiendo del lenguaje y del propio estilo del
programador. Por esta razn, el mejor criterio para medir la eficiencia de un
algoritmo es aislar una operacin especfica clave en la ordenacin y contar el
nmero de veces que se realiza. As, en el caso de los algoritmos de ordenacin,
se utilizar como medida de su eficiencia el nmero de comparaciones entre
elementos efectuados. El algoritmo de ordenacin A ser ms eficiente que el B, si
requiere menor nmero de comparaciones.

Los mtodos de ordenacin se suelen dividir en dos grandes grupos:
Directos: burbuja, seleccin, insercin.
Indirectos: (avanzados) Shell, ordenacin rpida, ordenacin por mezcla,
Radixsort.

B) Algoritmo de bsqueda: El proceso de encontrar un elemento especfico de un
array se denomina bsqueda. En esta seccin se examinarn dos tcnicas de
bsqueda: bsqueda lineal o secuencial, la tcnica ms sencilla, y bsqueda
binaria o dicotmica, la tcnica ms eficiente.

Al igual que sucede con las operaciones de ordenacin cuando se realizan
operaciones de bsqueda es preciso considerar la eficiencia (complejidad) de los
algoritmos empleados en la bsqueda. El grado de eficiencia en una bsqueda
ser vital cuando se trata de localizar una informacin en una lista o tabla en
memoria, o bien en un archivo de datos.

2. Comparacin de la eficiencia de los algoritmos de
ordenamientos: Seleccin, Insercin y Burbuja.

A) Ordenacin por seleccin: El algoritmo se apoya en sucesivas pasadas que
intercambian el elemento ms pequeo sucesivamente con el primer elemento de
la lista, A[0] en la primera pasada. En sntesis, se busca el elemento ms pequeo
de la lista y se intercambia con A[0], primer elemento de la lista.

Los pasos del algoritmo son:
1. Seleccionar el elemento ms pequeo de la lista A; intercambiarlo con el primer
elemento A[0]. Ahora la entrada ms pequea est en la primera posicin del
vector.

2. Considerar las posiciones de la lista A[1], A[2], A[3]..., seleccionar el elemento
ms pequeo e intercambiarlo con A[1]. Ahora las dos primeras entradas de A
estn en orden.

3. Continuar este proceso encontrado o seleccionando el elemento ms pequeo
de los restantes elementos de la lista, intercambindolos adecuadamente.

El anlisis del algoritmo de seleccin es sencillo y claro, ya que requiere un
nmero fijo de comparaciones que slo dependen del tamao de la lista o vector
(array) y no de la distribucin inicial de los datos.

B) Ordenacin por Insercin: el mtodo de ordenacin por insercin es similar al
proceso tpico de ordenar tarjetas de nombres (cartas de una baraja) por orden
alfabtico, que consiste en insertar un nombre en su posicin correcta dentro de
una lista o archivo que ya est ordenado.

El algoritmo correspondiente a la ordenacin por insercin contempla los
siguientes pasos:

1. El primer elemento A[0] se considera ordenado; es decir, la lista inicial consta
de un elemento.

2. Se inserta A[1] en la posicin correcta, delante o detrs de A[0], dependiendo
de que sea menor o mayor.

3. Por cada bucle o iteracin i(desde i=1 hasta n-1) se explora la sub-lista A[i-
1]..A[0] buscando la posicin correcta de insercin; a la vez se mueve hacia
abajo(a la derecha en la sub-lista)una posicin todos los elementos mayores que
el elemento que el elemento a insertar A[i], para dejar baca esa posicin.

4. Insertar el elemento a la posicin correcta.

El anlisis del algoritmo de insercin se determin que la complejidad del
algoritmo es complejidad cuadrtica.

C) Ordenacin por burbuja: es un sencillo algoritmo de ordenamiento. Funciona
revisando cada elemento de la lista que va a ser ordenada con el siguiente,
intercambindolos de posicin si estn en el orden equivocado.


Cul es la eficiencia del algoritmo de ordenacin de la burbuja? Depender de la
versin utilizada. En la versin ms simple se hacen n 1 pasadas y n 1
comparaciones en cada pasada. Por consiguiente, el nmero de comparaciones
es (n 1) * (n 1) = n2 2n + 1, es decir, la complejidad o(n2).
3. Algoritmos de ordenamiento y su eficiencia Quicksort

El algoritmo quicksort ordena un vector V eligiendo entre sus elementos un valor clave P que
acta como pivote, organiza tres secciones, izquierda-P-derecha, todos los elementos a la
izquierda debern ser menores a P, y los de la derecha mayores, los ordena sin tener que hacer
ningn tipo de mezcla para combinarlos, cmo elegimos el pivote?.
1. Mtodo 1: Lo ideal sera que el pivote fuera la mediana del vector para que las partes izquierda
y derecha tuvieran el mismo tamao.
2. Mtodo 2: recorremos el vector con un ndice i desde 0 a n-1, y otro ndice j inversamente y
cuando se crucen, es decir, tenga el mismo valor, ese se seleccionara como pivote.
Como se puede suponer, la eficiencia del algoritmo depende de la posicin en la que
termine el pivote elegido.
4. Algoritmos de ordenamiento y su eficiencia Heapsort
El ordenamiento por montculos (heapsort en ingls) es
un algoritmo de ordenamiento no recursivo, no estable, con complejidad
computacional
Este algoritmo consiste en almacenar todos los elementos del vector a ordenar en
un montculo (heap), y luego extraer el nodo que queda como nodo raz del
montculo (cima) en sucesivas iteraciones obteniendo el conjunto ordenado. Basa
su funcionamiento en una propiedad de los montculos, por la cual, la cima
contiene siempre el menor elemento (o el mayor, segn se haya definido el
montculo) de todos los almacenados en l. El algoritmo, despus de cada
extraccin, recoloca en el nodo raz o cima, la ltima hoja por la derecha del ltimo
nivel. Lo cual destruye la propiedad heap del rbol. Pero, a continuacin realiza un
proceso de "descenso" del nmero insertado de forma que se elige a cada
movimiento el mayor de sus dos hijos, con el que se intercambia. Este
intercambio, realizado sucesivamente "hunde" el nodo en el rbol restaurando la
propiedad montculo del arbol y dejndo paso a la siguiente extraccin del nodo
raz.
Algoritmo Lgico.
1. Se construye el montculo inicial a partir del arreglo original.
2. Se intercambia la raz con el ltimo elemento del montculo.
3. El ltimo elemento queda ordenado.
4. El ltimo elemento se saca del montculo, no del arreglo.
5. Se restaura el montculo haciendo que el primer elemento baje a laposicin que
le corresponde, si sus hijos son menores.
6. La raz vuelve a ser el mayor del montculo.
7. Se repite el paso 2 hasta que quede un solo elemento en el montculo.


Con esto concluimos que la eficacia del mtodo de ordenamiento Heapsort
depende de la data que se maneja, entre ms diferente y desordenada mejor.

5. Comparacin de la eficiencia de los algoritmos de bsqueda
Secuencial y Binaria
Los procesos de bsqueda involucran recorrer un arreglo completo con el fin de
encontrar algo. Lo ms comn es buscar el menor o mayor elemento (cuando se
puede establecer un orden), o buscar el ndice de un elemento determinado.
Bsqueda Secuencial: Consiste en ir comparando el elemento que se busca
con cada elemento del arreglo hasta cundo se encuentra.



Ventajas Desventajas
La principal ventaja es que este mtodo
funciona ms efectivamente con datos
desordenados

No es estable ya que se comporta de
manera ineficaz con datos del mismo
valor

Su desempeo es en promedio tan
bueno como el Quicksort y se comporta
mejor que este en los peores casos

Mtodo ms complejo

No necesita memoria adicional
Ejemplos de algoritmos:
Bsqueda del menor
menor = a[0];
for (i=1;i<n;i++)
if ( a[i]<menor )
menor=a[i];
Bsqueda del mayor
mayor= a[n-1];
for (i=0;i<n-1;i++)
if ( a[i]>mayor )
mayor=a[i];

Bsqueda Binaria: En el caso anterior de bsqueda se asume que los
elementos estn en cualquier orden. En el peor de los casos deben
hacerse n operaciones de comparacin. Una bsqueda ms eficiente
puede hacerse sobre un arreglo ordenado. Una de stas es la Bsqueda
Binaria. La Bsqueda Binaria, compara si el valor buscado est en la mitad
superior o inferior. En la que est, subdivido nuevamente, y as
sucesivamente hasta encontrar el valor.

Ejemplo de algoritmo:
b= 17;
i= 0;
j= tamao-1;
do {
k= (i+j)/2;
if (b<=v[k] )
i=k+1;
if (b>=v[k] )
j= k-1; } while (i<=j);
Bsqueda de elemento
encontrado=-1;
for (i=0;i<n;i++)
if ( a[i]==elemento_buscado
)
encontrado=i;

Comparacin: La bsqueda binaria es superiormente eficiente que la bsqueda secuencial,
aunque en arreglos pequeos ambos mtodos son relativamente equivalentes, esto se debe a que
recorre el arreglo haciendo comparaciones con el valor que se espera encontrar acortando su
tiempo de ejecucin, tambin hay que tomar en consideracin que para poder realizar la bsqueda
de forma binaria se debe ordenar el arreglo.
6. Algoritmo de bsqueda y su eficiencia de cadena Knuth-
Morris-Pratt
El algoritmo KMP, trata de localizar la posicin de comienzo de una cadena,
dentro de otra. Antes que nada con la cadena a localizar se precalcula una tabla
de saltos (conocida como tabla de fallos) que despus al examinar entre si las
cadenas se utiliza para hacer saltos cuando se localiza un fallo.
Supongamos una tabla 'F' ya precalculada, y supongamos que la cadena a buscar
est contenida en el array 'P()', y la cadena donde buscamos est contenida en un
array 'T()'. Entonces ambas cadenas comienzan a compararse usando un puntero
de avance para la cadena a buscar, si ocurre un fallo en vez de volver a la
posicin siguiente a la primera coincidencia, se salta hacia donde sobre la tabla,
indica el puntero actual de avance de la tabla. El array 'T' utiliza un puntero de
avance absoluto que considera donde se compara el primer carcter de ambas
cadenas, y utiliza como un puntero relativo (sumado al absoluto) el que utiliza para
su recorrido el array 'P'. Se dan 2 situaciones:
Mientras existan coincidencias el puntero de avance de 'P', se va
incrementando y si alcanza el final se devuelve la posicin actual del
puntero del array 'T'
Si se da un fallo, el puntero de avance de 'T' se actualiza hasta, con la
suma actual del puntero de 'P' + el valor de la tabla 'F' apuntado por el
mismo que 'P'. A continuacin se actualiza el puntero de 'P', bajo una de 2
cicunstancias; Si el valor de 'F' es mayor que -1 el puntero de 'P', toma el
valor que indica la tabla de salto 'F', en caso contrario vuelve a recomenzar
su valor en 0.

EFICIENCIA:
Los casos ptimos se denotan porque son todos ceros, o lo que es lo mismo, no se repiten
caracteres desde el principio.
El peor caso se da cuando la cadena se compone de 1 nico carcter.

7. Algoritmo de Boyer-Moore, bsqueda de patrones

El algoritmo de Boyer-Moore, considerado el algoritmo ms eficiente en la bsqueda de patrones
en cadena de caracteres, se basa en desplazar la ventana de comparacin lo mximo posible.
El algoritmo se desplaza dentro de la cadena de bsqueda de izquierda a derecha, y dentro del
patrn de derecha a izquierda. La mayor eficiencia se consigue minimizando el nmero de
comparaciones entre caracteres, desplazando lo mximo posible la venta de comparacin, a costa
de una computacin previa.
Notacin

y: cadena dnde se busca.
x: patrn de bsqueda.
| y | = n, longitud de y.
| x | = m, longitud de x.
j: posicin en y desde dnde se prueba la coincidencia.
i: posicin en x de comparacin, dnde se produce una no coincidencia , y[j+i] <>
x[i], y[j+i] = b, x[i] = a.
u: coincidencia en la comparacin, sufijo de x, u = y[j+i+..j+m] = x[i+1..m-1].
v: prefijo de x.
s: salto del patrn para la siguiente comparacin.
Al producirse una ocurrencia del patrn, o un error en la comparacin de un carcter, se calcula el
desplazamiento mximo del patrn a lo largo de la cadena de bsqueda.
Partimos de una situacin en que no hay coincidencia, existe diferencia entre y[j+i] y x[i], pero las
posiciones de x siguientes a i s coinciden con sus asociadas en y, u = y[j+i+..j+m] = x[i+1..m-1];
hacer notar que u es sufijo de x.
El desplazamiento de x a lo largo de y se limita a causa del carcter en y que produjo la no
coincidencia, y[i+j] (1), y los caracteres de x posteriores a i (2), sufijo de x que tena coincidencia
parcial con y.

(1) Teniendo en cuenta el carcter que produjo la no coincidencia en y, y[i+j] = b, el
desplazamiento mximo, s, ser la distancia entre la aparicin ms a la derecha de b en x[0..m-2] y
la longitud de x, m. La nueva j sera j=j+s, lo que se consigue es alinear las dos coincidencias de b
en x e y, desde dnde es posible que se produzca una coincidencia del patrn. Se considera el
intervalo 0..m-2, porque si se da el caso de que b es igual al ltimo carcter de x, el
desplazamiento sera 0, y podra provocar un bucle infinito debido a que el patrn no vara su
posicin.
(1)

(2) Teniendo en cuenta los caracteres posteriores a i en x (u, sufijo de x), que coinciden de forma
parcial con y, hay que alinear u lo ms a la derecha posible de x, sin que est precedido por x[i] = a
(2.a); al no estar u ya precedido por x[i] = a <> x[i-s] = c, en la nueva posicin de x respecto de y,
sabemos que existe la coincidencia u precedida por c, es posible que se produzca una ocurrencia
en y. Si no se encuentra la situacin anterior, se tratar de alinear el mayor sufijo posible de x con
un prefijo v tambin de x (2.b); como u coincide parcialmente en y, al buscar el prefijo v de x que
tambin es sufijo de x, v tambin est en y. Si no se producen ninguno de los dos casos anteriores,
el patrn se podr desplazar toda su longitud.
(2.a)

(2.b)

El desplazamiento de x a lo largo de y ser el mximo desplazamiento entre los dos anteriores, (1)
y (2).


Cdigo
- StringMatchingBM.java: Implementacin en Java del algoritmo de Boyer-Moore.
- StringMatchingBF.java: Implementacin en Java del algoritmo de fuerza bruta.
- StringMatchingTest.java: Clase en Java empleada para realizar las pruebas de rendimiento.
Resultado de las pruebas
100 tests --> BM: 70 millis (18462 comparisons)
100 tests --> BF: 50 millis (73898 comparisons)

1000 tests --> BM: 310 millis (187974 comparisons)
1000 tests --> BF: 341 millis (777391 comparisons)

10000 tests --> BM: 2424 millis (1877086 comparisons)
10000 tests --> BF: 2872 millis (8021317 comparisons)

100000 tests --> BM: 22760 millis (18809679 comparisons)
100000 tests --> BF: 34268 millis (79647647 comparisons)

8. Tcnicas de clculo de direcciones y comparaciones Hashing
Definicin:
Hasta ahora las tcnicas de localizacin de registros vistas, emplean un proceso de bsqueda que
implica cierto tiempo y esfuerzo. El siguiente mtodo nos permite encontrar directamente el registro
buscado.
La idea bsica de este mtodo consiste en aplicar una funcin que traduce un conjunto de posibles
valores llave en un rango de direcciones relativas. Un problema potencial encontrado en este
proceso, es que tal funcin no puede ser uno a uno; las direcciones calculadas pueden no ser
todas nicas, cuando R(k
1
)= R(k
2
)
Pero: K
1
diferente de K
2
decimos que hay una colisin. A dos llaves diferentes que les
corresponda la misma direccin relativa se les llama sinnimos.
A las tcnicas de clculo de direcciones tambin se les conoce como:
Tcnicas de almacenamiento disperso
Tcnicas aleatorias
Mtodos de transformacin de llave - a- direccin
Tcnicas de direccionamiento directo
Mtodos de tabla Hash
Mtodos de Hashing

Pero el trmino ms usado es el de hashing. Al clculo que se realiza para obtener una direccin a
partir de una llave se le conoce como funcin hash.



Ventaja
1. Se pueden usar los valores naturales de la llave, puesto que se traducen internamente a
direcciones fciles de localizar
2. Se logra independencia lgica y fsica, debido a que los valores de las llaves son
independientes del espacio de direcciones
3. No se requiere almacenamiento adicional para los ndices.
Desventajas
1. No pueden usarse registros de longitud variable
2. El archivo no est clasificado
3. No permite llaves repetidas
4. Solo permite acceso por una sola llave
Costos
Tiempo de procesamiento requerido para la aplicacin de la funcin hash
Tiempo de procesamiento y los accesos E/S requeridos para solucionar las colisiones.





La eficiencia de una funcin hash depende de:
1. La distribucin de los valores de llave que realmente se usan
2. El nmero de valores de llave que realmente estn en uso con respecto al tamao del espacio
de direcciones
3. El nmero de registros que pueden almacenarse en una direccin dad sin causar una colisin
4. La tcnica usada para resolver el problema de las colisiones

Las funciones hash ms comunes son:
Residuo de la divisin
Medio del cuadrado
Pliegue














HASHING POR RESIDUO DE LA DIVISIN
La idea de este mtodo es la de dividir el valor de la llave entre un numero apropiado, y despus
utilizar el residuo de la divisin como direccin relativa para el registro (direccin = llave mdulo
divisor).
Mientras que el valor calculado real de una direccin relativa, dados tanto un valor de llave como el
divisor, es directo; la eleccin del divisor apropiado puede no ser tan simple. Existen varios factores
que deben considerarse para seleccionar el divisor:
1. El rango de valores que resultan de la operacin llave % divisor, va desde cero hasta el
divisor 1. Luego, el divisor determina el tamao del espacio de direcciones relativas. Si se sabe
que el archivo va a contener por lo menos n registros, entonces tendremos que hacer que
divisor > n, suponiendo que solamente un registro puede ser almacenado en una direccin
relativa dada.
2. El divisor deber seleccionarse de tal forma que la probabilidad de colisin sea minimizada.
Cmo escoger este nmero? Mediante investigaciones se ha demostrado que los divisores
que son nmeros pares tienden a comportase pobremente, especialmente con los conjuntos
de valores de llave que son predominantemente impares. Algunas investigaciones sugieren
que el divisor deber ser un nmero primo. Sin embargo, otras sugieren que los divisores no
primos trabajan tambin como los divisores primos, siempre y cuando los divisores no primos
no contengan ningn factor primo menor de 20. Lo ms comn es elegir el nmero primo ms
prximo al total de direcciones.



Independientemente de que tan bueno sea el divisor, cuando el espacio de direcciones de un
archivo est completamente lleno, la probabilidad de colisin crece dramticamente. La saturacin
de archivo de mide mediante su factor de carga, el cual se define como la relacin del nmero de
registros en el archivo contra el nmero de registros que el archivo podra contener si estuviese
completamente lleno.

Todas las funciones hash comienzan a trabajar probablemente cuando el archivo esta casi lleno.
Por lo general el mximo factor de carga que puede tolerarse en un archivo para un rendimiento
razonable es de entre el 70 % y 80 %.
HASHING POR MEDIO DEL CUADRADO
En esta tcnica, la llave es elevada al cuadrado, despus algunos dgitos especficos se extraen de
la mitad del resultado para constituir la direccin relativa. Si se desea una direccin de n dgitos,
entonces los dgitos se truncan en ambos extremos de la llave elevada al cuadrado, tomando n
dgitos intermedios. Las mismas posiciones de n dgitos deben extraerse para cada llave.
Utilizando esta funcin hashing el tamao del archivo resultante es de 10
n
donde n es el nmero de
dgitos extrados de los valores de la llave elevada al cuadrado.




HASHING POR PLIEGUE
En esta tcnica el valor de la llave es particionada en varias partes, cada una de las cuales
(Excepto la ltima) tiene el mismo nmero de dgitos que tiene la direccin relativa objetivo. Estas
particiones son despus plegadas una sobre otra y sumadas. El resultado, es la direccin relativa.
Igual que para el mtodo del medio del cuadrado, el tamao del espacio de direcciones relativas es
una potencia de 10.

COMPARACIN ENTRE LAS FUNCIONES HASH
Aunque alguna otra tcnica pueda desempearse mejor en situaciones particulares, la tcnica del
residuo de la divisin proporciona el mejor desempeo. Ninguna funcin hash se desempea
siempre mejor que las otras. El mtodo del medio del cuadrado puede aplicarse en archivos con
factores de cargas bastantes bajas para dar generalmente un buen desempeo. El mtodo de
pliegues puede ser la tcnica ms fcil de calcular pero produce resultados bastante errticos, a
menos que la longitud de la llave se aproximadamente igual a la longitud de la direccin.
Si la distribucin de los valores de llaves no es conocida, entonces el mtodo del residuo de la
divisin es preferible. Note que el hashing puede ser aplicado a llaves no numricas. Las
posiciones de ordenamiento de secuencia de los caracteres en un valor de llave pueden ser
utilizadas como sus equivalentes numricos. Alternativamente, el algoritmo hash acta sobre las
representaciones binarias de los caracteres.
Todas las funciones hash presentadas tienen destinado un espacio de tamao fijo. Aumentar el
tamao del archivo relativo creado al usar una de estas funciones, implica cambiar la funcin hash,
para que se refiera a un espacio mayor y volver a cargar el nuevo archivo.
9. MTODOS PARA RESOLVER EL PROBLEMA DE LAS
COLISIONES
Considere las llaves K
1
y K
2
que son sinnimas para la funcin hash R. Si K
1
es almacenada
primero en el archivo y su direccin es R(K
1
), entonces se dice que K
1
esta almacenado en su
direccin de origen.



Existen dos mtodos bsicos para determinar dnde debe ser alojado K
2
:
Direccionamiento abierto.- Se encuentra entre direccin de origen para K
2
dentro del archivo.
Separacin de desborde (rea de desborde).- Se encuentra una direccin para K
2
fuera del
rea principal del archivo, en un rea especial de desborde, que es utilizada exclusivamente
para almacenar registro que no pueden ser asignados en su direccin de origen


Los mtodos ms conocidos para resolver colisiones son:

Sondeo lineal
Que es una tcnica de direccionamiento abierto. Este es un proceso de bsqueda secuencial
desde la direccin de origen para encontrar la siguiente localidad vaca. Esta tcnica es tambin
conocida como mtodo de desbordamiento consecutivo.
Para almacenar un registro por hashing con sondeo lineal, la direccin no debe caer fuera del
lmite del archivo, En lugar de terminar cuando el lmite del espacio de direccin se alcanza, se
regresa al inicio del espacio y sondeamos desde ah. Por lo que debe ser posible detectar si la
direccin base ha sido encontrada de nuevo, lo cual indica que el archivo est lleno y no hay
espacio para la llave.
Para la bsqueda de un registro por hashing con sondeo lineal, los valores de llave de los registros
encontrados en la direccin de origen, y en las direcciones alcanzadas con el sondeo lineal, deber
compararse con el valor de la llave buscada, para determinar si el registro objetivo ha sido
localizado o no.

El sondeo lineal puede usarse para cualquier tcnica de hashing. Si se emplea sondeo lineal para
almacenar registros, tambin deber emplearse para recuperarlos.

Doble hashing
En esta tcnica se aplica una segunda funcin hash para combinar la llave original con el resultado
del primer hash. El resultado del segundo hash puede situarse dentro del mismo archivo o en un
archivo de sobreflujo independiente; de cualquier modo, ser necesario algn mtodo de solucin
si ocurren colisiones durante el segundo hash.
La ventaja del mtodo de separacin de desborde es que reduce la situacin de una doble colisin,
la cual puede ocurrir con el mtodo de direccionamiento abierto, en el cual un registro que no est
almacenado en su direccin de origen desplazara a otro registro, el que despus buscar su
direccin de origen. Esto puede evitarse con direccionamiento abierto, simplemente moviendo el
registro extrao a otra localidad y almacenando al nuevo registro en la direccin de origen ahora
vaca.
Puede ser aplicado como cualquier direccionamiento abierto o tcnica de separacin de desborde.
Para ambas mtodos para la solucin de colisiones existen tcnicas para mejorar su desempeo
como:
1.- Encadenamiento de sinnimos
Una buena manera de mejorar la eficiencia de un archivo que utiliza el clculo de direcciones, sin
directorio auxiliar para guiar la recuperacin de registros, es el encadenamiento de sinnimos.
Mantener una lista ligada de registros, con la misma direccin de origen, no reduce el nmero de
colisiones, pero reduce los tiempos de acceso para recuperar los registros que no se encuentran
en su localidad de origen. El encadenamiento de sinnimos puede emplearse con cualquier tcnica
de solucin de colisiones.
Cuando un registro debe ser recuperado del archivo, solo los sinnimos de la llave objetivo son
accesados.
2.- Direccionamiento por cubetas
Otro enfoque para resolver el problema de las colisiones es asignar bloques de espacio (cubetas),
que pueden acomodar ocurrencias mltiples de registros, en lugar de asignar celdas individuales a
registros. Cuando una cubeta es desbordada, alguna nueva localizacin deber ser encontrada
para el registro. Los mtodos para el problema de sobrecupo son bsicamente el mismo que los
mtodos para resolver colisiones.
COMPARACIN ENTRE SONDEO LINEAL Y DOBLE HASHING
De ambos mtodos resultan distribuciones diferentes de sinnimos en un archivo relativo. Para
aquellos casos en que el factor de carga es bajo (< 0.5), el sondeo lineal tiende a agrupar los
sinnimos, mientras que el doble hashing tiende a dispersar los sinnimos ms ampliamente a
travs del espacio de direcciones.
El doble hashing tiende a comportarse casi tambin como el sondeo lineal con factores de carga
pequeos (< 0.5), pero acta un poco mejor para factores de carga mayores. Con un factor de
carga > 80 %, el sondeo lineal por lo general resulta tener un comportamiento terrible, mientras que
el doble hashing es bastante tolerable para bsquedas exitosas pero no as en bsquedas no
exitosas.


Conclusin
-Algunas veces la eficiencia de un programa es algo transparente para los
usuarios y a veces para el desarrollador joven, pues la diferencia en tiempo de
ejecucin entre un programa eficiente y uno no eficiente y la cantidad de recursos
que utilizan suelen ser irrelevantes por el tipo de aplicaciones que se programan.
Pero es ciertamente es un tema de mucha importancia en especial en niveles ms
altos de programacin, cuando la lgica y el cdigo se domine solo queda
optimizar. Es muy interesante investigar diferentes algoritmos con particularidades
diferentes aunque cuenten con el mismo fin como por ejemplo la bsqueda
secuencial y Binaria, las 2 hacen los mismo pero tienen sus beneficios e
inconvenientes, pues la bsqueda binaria requiere que se ordenen los elementos
a analizar lo que requiere programacin extra, la bsqueda secuencial es ms
sencilla y no requiere que se ordenen los elementos pero en el peor de los casos
comparar todos los elementos presentes. Entonces cae en el programador decidir
que algoritmo le beneficia a su aplicacin.

También podría gustarte