algoritmos de busqueda - hash truncamiento

14
Universidad Tecnológica de Chile Ingeniería Informática Algoritmos de búsqueda. Truncamiento. Integrantes : Mario Bustamante Luis Guzmán Asignatura : Análisis de algoritmo Fecha : 17 04 2014 Sección : 112 Profesora : Pilar Pardo

Upload: lutzo-guzman

Post on 11-Jul-2015

1.434 views

Category:

Software


7 download

TRANSCRIPT

Page 1: Algoritmos de busqueda - hash truncamiento

Universidad Tecnológica de Chile

Ingeniería Informática

Algoritmos de búsqueda.

Truncamiento.

Integrantes : Mario Bustamante Luis Guzmán Asignatura : Análisis de algoritmo Fecha : 17 – 04 – 2014 Sección : 112 Profesora : Pilar Pardo

Page 2: Algoritmos de busqueda - hash truncamiento

1 | P á g i n a

Contenido I.- Introducción. ................................................................................................................................... 2

II.- Desarrollo. ...................................................................................................................................... 3

1.- Búsqueda Lineal. ........................................................................................................................ 4

2.- Búsqueda Binaria. ...................................................................................................................... 5

3.- Búsqueda por transformación de claves (hashing). ................................................................... 6

3.1.- Plegamiento. ....................................................................................................................... 6

3.2.- Aritmética Modular. ............................................................................................................ 6

3.3.- Mitad del cuadrado. ............................................................................................................ 7

3.4.- Truncamiento. ..................................................................................................................... 7

6.- Colisiones. ................................................................................................................................ 11

6.1.- Reasignación. .................................................................................................................... 11

6.2.- Arreglos anidados. ............................................................................................................ 12

6.3.- Encadenamiento. .............................................................................................................. 12

III.- Conclusión. .................................................................................................................................. 13

Page 3: Algoritmos de busqueda - hash truncamiento

2 | P á g i n a

I.- Introducción.

Los algoritmos de búsqueda son aquellos diseñados para localizar

elementos específicos dentro de una estructura.

En el presente informe se darán a conocer los algoritmos de búsqueda

lineal, binaria, y por transformación de claves o hash. Desarrollando su definición,

su mejor y peor caso, además de su caso promedio, con ejemplos en los casos

mencionados. Dando a destacar el Hash de Truncamiento.

Además se mostrará que sucede en caso de que dos claves choquen

dentro de un arreglo, lo más bien conocido como colisión. Dando a conocer

algunas formas de resolver estas colisiones.

Page 4: Algoritmos de busqueda - hash truncamiento

3 | P á g i n a

II.- Desarrollo.

Los algoritmos de búsqueda son aquellos diseñados para localizar a un

elemento con propiedades específicas dentro de una estructura (array) de datos.

Mientras que los algoritmos de ordenamiento son cuales ponen elementos de una

lista o vector en una posición dada por alguna relación de orden, o algún cambio

en su estructura. Existen los siguientes tipos de búsqueda:

- Búsqueda Lineal.

- Búsqueda Binaria.

- Búsqueda por transformación de claves (hashing).

Page 5: Algoritmos de busqueda - hash truncamiento

4 | P á g i n a

1.- Búsqueda Lineal.

La búsqueda lineal consiste en buscar de manera secuencial un elemento,

es decir, preguntar si el elemento que se está buscando es igual al primero, si no

pasa al segundo, si no al tercero, así sucesivamente hasta encontrar la igualdad o

llegar al final del vector.

En caso de almacenar el elemento se envía un mensaje con un resultado

positivo y la posición en la que se almacenó, y en caso de que no se almacene se

envía un resultado negativo.

Esta búsqueda no necesita que el vector esté ordenado o que sea par o

impar.

El mejor de los casos se presenta cuando la búsqueda termina tan pronto

como se inicia, puede darse el caso de que la primera posición examinada sea la

que contenga el elemento que se está buscando.

El peor de los casos se presenta cuando el elemento a buscar se encuentra

en la última posición del vector.

El caso promedio es cuando el elemento a buscar se encuentra en la

posición central del vector, esta se presenta con la formula N/2 donde N es el

tamaño del vector.

Ejemplo:

Buscar el elemento “10”, “14”, “19” en el vector.

0 1 2 3 4 5 6 7 8 9

10 11 12 13 14 15 16 17 18 19

Al buscar el elemento “10” se ejemplifica el mejor de los casos ya que está

presente al comienzo del vector y sólo se debe realizar una comparación. Al

buscar el elemento “14” se observa el caso promedio ya que está en la posición

central del vector. Y al buscar el elemento “19” se muestra el peor de los casos ya

que se debe recorrer todo el vector para encontrar el elemento.

Page 6: Algoritmos de busqueda - hash truncamiento

5 | P á g i n a

2.- Búsqueda Binaria.

La búsqueda Binaria consiste en buscar el elemento en el centro del vector,

en caso de que esta posición no sea la que se está buscando se compara si el

índice es mayor o menor, en caso de que el índice sea mayor se considera el

vector desde la posición central hacia los mayores y la otra mitad se desecha, en

caso contrario si el índice es menor se toma desde el centro del vector hasta las

posiciones menores y el resto se desecha. Este procedimiento se hace hasta que

se encuentre la posición requerida con los nuevos vectores más pequeños que se

van generando al realizar el procedimiento.

Un requerimiento de este tipo de búsqueda es que el vector debe estar

ordenado.

Utiliza la lógica de “divide y vencerás”.

El mejor de los casos se presenta cuando la búsqueda requiere de sólo una

comparación. Cuyo esfuerzo mínimo sea 1.

El caso promedio se expresa con el cálculo 1/2log2n.

El peor de los casos está expresada por el cálculo de log2n, lo que

representa el esfuerzo máximo para el algoritmo, lo que quiere decir que tras

todas las divisiones realizadas se localizará el elemento o se tendrá la certeza de

que el elemento no existe.

Ejemplo

Page 7: Algoritmos de busqueda - hash truncamiento

6 | P á g i n a

3.- Búsqueda por transformación de claves (hashing).

Hashing consiste en una transformación matemática con una función que

da como resultado la posición en que se guardará o buscará una clave.

3.1.- Plegamiento.

El plegamiento consiste en dividir la clave en distintas partes, luego

combinarlas ya sea mediante una operación de suma o multiplicación para así

obtener un índice. Todas las partes, excluyendo la última, deben tener la misma

cantidad de dígitos. En caso de que el largo de la clave supere el largo del vector

se trunca la clave para que pueda ser almacenada.

Ejemplo.

Vector de 100 posiciones. Clave: 28312405 Procedimiento: H(clave) = 283 + 124 + 05 H(clave) = 412 (resultado que sobrepasa el límite del vector, por este motivo se trunca) 4|12 = 12 Así la clave será guardada en la posición 12 del vector.

3.2.- Aritmética Modular.

La aritmética modular consiste en convertir la clave a un entero, lo que se

hace es dividir la clave por el tamaño del vector, el resto o residuo de esta división

es la posición del vector donde se almacenará.

Ejemplo.

Vector de 100 posiciones. Clave: 12325 Procedimiento: H(clave) = 12325 MOD 100 H(clave) = 25

Lo que quiere decir que la clave será guardada en la posición 25 del vector

Page 8: Algoritmos de busqueda - hash truncamiento

7 | P á g i n a

3.3.- Mitad del cuadrado.

La mitad del cuadrado consiste en calcular el cuadrado de la clave y tomar

los dígitos centrales de este resultado, estos dígitos serán la posición del vector

para almacenar el dato (en caso de que la cifra resultante sea impar se toma el

valor central y el número anterior).

La función está expresada por la fórmula: H(x) = X^2 (donde x es la clave).

Ejemplo.

Vector de 100 posiciones. Clave: 562 Procedimiento: H(clave) = 562^2 H(clave) = 315844

Lo que quiere decir que la clave será guardada en la posición 58.

3.4.- Truncamiento.

El truncamiento consiste en tomar algunos dígitos de la clave y con estos

formar una posición en un array. Se ignora parte de la clave para con el resto

formar un índice de almacenamiento.

La idea consiste en tener un listado de números, seleccionar por ejemplo la

posición 2, 4 y 6; para así tener una posición en donde poder almacenar la clave.

Llevando esto a un ejemplo práctico:

5700931 → 703

3498610 → 481

0056241 → 064

9134720 → 142

5174829 → 142

Page 9: Algoritmos de busqueda - hash truncamiento

8 | P á g i n a

Lo positivo del truncamiento y una de las ventajas por sobre otros métodos

de búsqueda y ordenamiento es que no solo funciona con valores numéricos,

también funciona con caracteres alfabéticos, esto se puede aplicar de dos formas:

1) Transformar cada carácter en un número asociado a su posición en el

abecedario.

2) Transformar cada carácter en un número asociado a su valor según el

código ASCII.

Una vez obtenida la clave en forma numérica, se puede utilizar

normalmente.

La elección de los dígitos a considerar es arbitraria, pueden tomarse

posiciones pares o impares. Luego se les puede unir de izquierda a derecha o de

derecha a izquierda.

La función queda definida por:

H(K) = dígitos(t1 t2 t3 … tn)+1

Existen casos en los que a la clave generada se le agrega una unidad, esto

es para los casos en el que el vector de almacenamiento tenga valores entre el 1 y

el 100, así se evita la obtención de un valor 0.

H(K1) = dígitos(7 2 5 9) + 1 = 76

H(K2) = dígitos(9 3 5 9) + 1 = 96

Una de las principales desventajas de utilizar truncamiento y en sí el

método de hashing es que dos o más claves puede tomar una misma posición

dentro de la tabla de hash, a esto es a lo que se le llama Colisión. Cuando hay

colisiones se requiere de un proceso adicional para encontrar la posición

disponible para la clave, lo cual disminuye la eficiencia del método.

Page 10: Algoritmos de busqueda - hash truncamiento

9 | P á g i n a

Mejor de los casos.

El mejor de los casos es cuando el elemento buscado se encuentra en la

primera posición, en cuyo caso el algoritmo indicará que se encontró la clave tras

una sola comparación. En el caso del ordenamiento se considera el mejor de los

casos cuando todas las claves son perfectamente ordenadas, sin ningún caso de

colisión. Cuando una función logra evitar el 100% de las colisiones es conocida

como Hashing Perfecto.

Caso Promedio.

El caso promedio es cuando el elemento buscado se encuentra, pero no en

la primera posición, eso provoca que el tiempo de búsqueda se alargue para

encontrar la posición requerida. En el caso de ordenamiento se considera el caso

promedio cuando existen algunas colisiones, demorando más al algoritmo en

ordenar, pero sin mayores problemas.

Page 11: Algoritmos de busqueda - hash truncamiento

10 | P á g i n a

Peor de los casos.

El peor de los casos que se puede encontrar es cuando se produce una

colisión en las posiciones, esto quiere decir que la posición en la que se va a

almacenar una clave ya está siendo utilizada por otra. En el caso de ordenamiento

se considera el peor de los casos cuando todas las claves van a una sola posición

del array, produciendo una totalidad de colisiones.

Page 12: Algoritmos de busqueda - hash truncamiento

11 | P á g i n a

6.- Colisiones.

Una colisión se produce cuando una función hash obtiene una misma dirección para dos

claves distintas. Los métodos más utilizados para resolverlas son:

- Reasignación.

- Arreglos anidados.

- Áreas de desborde.

6.1.- Reasignación.

El método de reasignación trabaja bajo principios de comparación, entre los más utilizados

están:

- Prueba lineal.

- Prueba cuadrática.

- Doble dirección hash.

6.1.1.- Prueba lineal.

La prueba lineal consiste en que una vez que se detecta la colisión se debe recorrer el

vector a partir del punto de colisión, buscando el elemento. Este proceso concluye cuando se

encuentra el elemento buscado o cuando se encuentra una posición vacía. Si el arreglo llega a su

fin se vuelve a comenzar por el inicio de este.

La desventaja de este método es que puede ser que las claves estén agrupadas en zonas

específicas, dejando grandes espacios vacíos.

Page 13: Algoritmos de busqueda - hash truncamiento

12 | P á g i n a

6.1.2.- Prueba cuadrática.

La prueba cuadrática se rige bajo los mismos términos que la prueba lineal. La diferencia

está en que las direcciones alternativas se generan con el cuadrado de estas. Esto permite una

mejor distribución de las claves colisionadas. (D + 1, D + 4, D + 9… considerando D como la clave y

el número entero como el cuadrado de la siguiente posición).

La desventaja de este método es que existen casillas que no son vistas.

6.1.3.- Doble dirección hash.

La doble dirección hash consiste en que una vez que se detecta la colisión se debe generar

una nueva dirección utilizando una función hash a la dirección. Esta acción se repite hasta

encontrar el elemento o hasta cuando se encuentre una posición vacía.

6.2.- Arreglos anidados.

Los arreglos anidados consisten en que cada elemento del arreglo tenga otro arreglo en el

cual se almacenan los elementos colisionados. No siendo siempre la solución más efectiva, ya que

lo hace depender mucho del espacio de memoria requerido.

6.3.- Encadenamiento.

El encadenamiento consiste en que cada elemento del arreglo tenga un puntero a una lista

ligada. Así cuando se produzca la colisión se guardará normalmente en su posición, pero de la lista

ligada.

Page 14: Algoritmos de busqueda - hash truncamiento

13 | P á g i n a

III.- Conclusión.

Para concluir se puede mencionar que cada algoritmo que existe tiene un

mejor caso, un caso promedio y un peor caso, dados por distintas funciones

obviamente. Cada algoritmo tiene ventajas y desventajas por sobre los demás, es

por esto que al momento de utilizarlos se deben contemplar bien estas ventajas y

desventajas para poder trabajar de la forma más eficiente.

Uno de los puntos a destacar del truncamiento por sobre otros métodos de

ordenamiento es que funciona con caracteres tanto numéricos como alfabéticos.

Además de que es modificable en la selección de los caracteres a considerar para

la posición de la clave a considerar.