1
Introducción
En este trabajo relacionado con la Aritmética Modular se mencionarán y
explicarán los tipos de algoritmos de búsqueda, los métodos de transformación de claves, desventajas del hashing. Explicaremos también qué pasa cuando existe coincidencia de direcciones, explicando con ejemplos los casos propuestos.
2
ANÁLISIS ALGORITMOS
Algoritmos de Búsqueda
La forma en que funciona un algoritmo de búsqueda es lograr ubicar
información dentro de una colección de datos dados. Lo que cabe destacar de
esto, es saber si un elemento pertenece o no a una estructura de datos, en caso
de pertenecer se necesita saber el índice de la lista en el que se encuentra el
elemento.
Entre los Algoritmos de Búsqueda los que más destacan son: Búsqueda
Secuencial o lineal, Búsqueda Binaria y las Técnicas de Hashing.
3
Búsqueda lineal o secuencial.
La búsqueda lineal es la técnica más sencilla para encontrar un elemento en
una lista de datos, esto consiste en recorrer un arreglo elemento a elemento e ir
comparando con el valor deseado (clave), hasta que se encuentre o finalice el
arreglo.
La búsqueda finaliza exitosamente, es decir encontró el dato buscado, lo
que se necesita conocer es en qué posición fue encontrado el dato buscado,
también está la posibilidad de que la búsqueda termine sin éxito, esto es cuando
se determina que no se obtiene ningún registro con esa llave. Esto se puede
aplicar en todos los tipos de búsqueda.
El proceso en sí de la búsqueda lineal es comenzar a comparar desde la
primera casilla del arreglo y se observan una a una las casillas hasta que se
encuentra el elemento o hasta terminar con las casillas de la lista sin obtener el
resultado.
En la búsqueda lineal no requiere que el arreglo se encuentre en algún
orden en particular ya que existe la misma probabilidad de que el valor se
encuentre en el primer elemento (el mejor caso) o en el último elemento (el peor
caso), por lo tanto en promedio el programa tendrá que comparar el valor buscado
con la mitad de los elementos del arreglo.
Algunas desventajas de la búsqueda lineal es que el método funciona bien
con arreglos pequeños o para arreglos no ordenados.
Este método de búsqueda es muy lento, pero si los datos no están en
orden, es el único método que puede utilizarse para hacer las búsquedas.
Ejemplo:
4
Complejidad de búsqueda lineal
MEJOR CASO:
Si tenemos mucha suerte, puede ser que la primera posición examinada
contenga el elemento que buscamos, en cuyo caso el algoritmo informará que tuvo
éxito después de una sola comparación. Por tanto, su complejidad será O (1).
PEOR CASO:
Sucede cuando encontramos X en la última posición del array. Como se
requieren n ejecuciones del bucle mientras, la cantidad de tiempo es proporcional
a la longitud del array n, más un cierto tiempo para realizar las condiciones del
bucle mientras y para la llamada al método. Por lo tanto, la cantidad de tiempo es
de la forma an + b para ciertas constantes ay b. En notación O, O (an+b) = O
(an) = O(n).
CASO MEDIO:
Supongamos que cada elemento almacenado tiene la misma probabilidad de
ser buscado. La media se puede calcular tomando el tiempo total de encontrar
todos los elementos y dividiéndolo por n: Total = a (1 + 2 +...+n) + bn = a
(n(n+1) / 2) + bn Media = (Total / n) = a ((n+1) / 2) + b que es O(n).
5
Búsqueda binaria
Para poder utilizar este algoritmo, el arreglo debe estar ordenado y no
deben haber elemento repetidos, esta búsqueda consiste en primer lugar comparar
el componente central del arreglo si este coincide la búsqueda finaliza y si no es el
valor buscado, entonces se divide el arreglo en dos subarreglos más pequeños y se
continua con el que puede contener el valor buscado esto si define al comparar el
valor central y si el elemento que estoy comparando es mayor que el del valor
central entonces continuare la búsqueda con el subarreglo de la derecha y
nuevamente comparando el valor central y generando otros subarreglos en forma
consecutiva hasta dar con el valor a encontrar en este caso termina el algoritmo o
si el tamaño del intervalo de búsqueda queda anulado.
Este mecanismo es muy eficiente para buscar un elemento cualquiera que
esté en una lista ordenada y recibe el nombre de búsqueda binaria o dicotómica
cuya resolución se basa en algoritmo de divisiones sucesivas en mitades.
EJEMPLO
Se intenta buscar el elemento 3 en el arreglo {1,2,3,4,5,6,7,8,9}, se
realizaran los siguientes pasos.
Se toma el elemento central y se divide en dos subarreglos
6
Búsqueda mediante Transformación de Claves (Hashing)
Este método genera claves o llaves que representen de manera casi unívoca
a un documento o conjunto de datos. Este método nos permite aumentar
la velocidad de búsqueda sin necesidad de tener los elementos ordenados. Cuenta
también con la ventaja de que el tiempo de búsqueda es
prácticamente independiente del número de componentes del arreglo.
Una importante desventaja de hashing es que el conjunto de posibles claves
es siempre mayor al número de espacios disponibles. Es decir, dos o más claves
pueden asignarse a la misma dirección en la tabla de hash. Cuando dos claves se
direccionan a la misma dirección o bucket se dice que hay una colisión, y a las
claves se les denomina sinónimos.
Cuando hay colisiones se requiere de un proceso adicional para encontrar
una posición disponible para la clave. Esto obviamente degrada la eficiencia del
método, por lo que se trata de evitar al máximo esta situación. Una función de
hashing que logra evitar al 100% las colisiones es conocida como hashing
perfecto.
7
Si una empresa tiene 100 empleados, y si a cada empleado se le asigna un
código como número de identificación de 1 a 100, evidentemente puede existir
una correspondencia directa entre la clave y la dirección definida en un vector de
100 elementos.
En otro caso si la empresa tiene 80.000 empleados ya no se puede utilizar
la relación entre la clave y la dirección.
Este método consiste en la transformación de claves (dadas numéricas o
alfanuméricas) en una dirección (índice) dentro del vector.
La correspondencia entre las claves y la dirección en el vector se establece por una
dirección definida de conversión (función hash).
Métodos de transformación de claves.
Existen numerosos métodos de transformación de claves
1. Truncamiento
2. Plegamiento
3. Aritmética Modular
4. Mitad del Cuadrado
8
TRUNCAMIENTO
Ignora parte de la clave y utiliza la parte restante directamente como
índice (Considerando campos no numéricos y sus códigos numéricos) .Si las
claves por ejemplo, son enteros de 8 dígitos y la tabla de transformación
tiene 1000 posiciones entonces el primero, segundo y quinto dígitos desde la
derecha pueden formar la función de conversión.
0
Clave=72588495
:
El truncamiento es un método muy rápido pero falla para distribuir las claves
de modo uniforme.
Ejemplos:
12345678 --> 138
13602499 --> 169
71140205 --> 715
73162135 --> 715
9
PLEGAMIENTO
Consiste en la partición de la clave en diferentes partes y la
combinación de las partes en un modo conveniente (a menudo utilizando
suma o multiplicación) para obtener el índice .La clave x se divide en varias
partes donde cada parte tienen el mismo número de dígitos que la dirección
especificada.
1000 000 a 999 Fx=x1+x2+x3...+xn
625 381 94 625+381+94=1100 100
Esta técnica consiste en la partición de la clave en diferentes partes y
la combinación de las partes en un modo conveniente (a menudo utilizando suma o
multiplicación) para obtener el índice.
Ejemplo 1:
Un entero de 8 dígitos se puede dividir en grupos de tres (3), tres (3) y dos(2)
dígitos, los grupos se suman y se truncan si es necesario para que estén en el rango
adecuado de índices.
Se considera la clave 62538194 y el número de direcciones es 100:
H (clave)=625 + 381 + 94 =1100 se trunca -> H (clave)=100
Ejemplo 2:
El número de identificación de los empleados es el campo clave de una
empresa y consta de cuatro dígitos y las direcciones reales son
100. Se desea calcular las direcciones correspondientes por el método de
plegamiento.
Claves: 4205, 3355, 8148
H(4205) = 42 + 05 = 47
H(3355) = 33 + 55 = 88
H(8148) = 81 + 48 = 129 –> 129-100 =29
10
ARITMÉTICA MODULAR
Convertir la clave a un entero, dividir por el tamaño del rango del
índice y tomar el resto como resultado. La función de conversión utilizada es
MOD (Modulo o resta de división entera).
Donde el mes el tamaño del arreglo con índices de 0 hasta n-1. Los valores
de la función y direcciones van de 0 a n-1 ligeramente menor al tamaño del
array. La mejor elección de los módulos son los números primos.
M=100 F(x) = x mod 100
X=234661234
F(x) =234661234 mod 100 =34
La clave de búsqueda en una cadena de caracteres tal como el
nombre para obtener direcciones de conversión el método más simple es
asignar a cada caracter de la cadena un valor entero (ejemplo A=1, B=2,
C=3, etc.) y sumar los valores de los caracteres en la cadena al resultado se
le aplica entonces el modulo.
Ejemplos:
12345678 --> 7
13602499 --> 1
71140205 --> 6
73062138 --> 6
Ejemplo1:
Un vector T tiene cien posiciones (0..100). Se tiene que las claves
de búsqueda de los elementos de la tabla son enteros positivos.
Calcular la dirección si la clave es: 234661234.
Si clave=234661234
Y el tamaño del rango del vector = 101. Entonces:
234661234 MOD 101 = 56
11
Ejemplo2:
Se tiene un array con 100 posiciones para guardar las claves de los
empleados. Aplicar las funciones para cada uno de los siguientes
empleados:
3205 7148 2345
Usando la Aritmética Modular (Método de la división)
Escojo un numero primo próximo a 100 (m=97). Aplico la función hash H(x)
= X / m
H(3205)=4 H(7148)=67 H(2345)=17
EJEMPLO 3:
Que se debe hacer cuando las claves son distintas y la dirección
es la misma en el caso del método de división.
El tamaño del arreglo N=100, sus direcciones van de 1-100.
Sea K1 = 7259 H(K1) = (7259 mod 100)+1=60
K2 = 9359 H(K2) = (9359 mod 100)+1=60
Claves distintas y direcciones iguales estamos en presencia de una colisión.
Se aplica N igual a un valor primo en lugar de utilizar el N=100
H(K1)=(7259 mod 97) +1 = 82
H(K2)=(9359 mod 97) + 1 = 48
Con N= 97 se ha eliminado la colisión ya que las direcciones ahora son
distintas.
12
MITAD DEL CUADRADO
Este método consiste en calcular el cuadrado de la clave x. La
función de conversión se define como F(x)=C donde C se obtiene eliminado
dígitos de ambos extremos de x2; para todas las claves se deben usar las
mismas posiciones de x2. Ejemplo:
Una empresa tiene 80 empleados y cada uno de ellos tiene un número de
identificación de 4 dígitos y el conjunto de direcciones de memoria varia en
un rango de 0 a 100 calcular las direcciones que se obtendrán al aplicar
mitad del cuadrado.
Clave x x2 4 y 5
4205 176 82 025 82
7148 510 93 904 93
3350 112 22 500 22
Ejemplos:
136*136=18496 --> 84
730*730=532900 --> 29
301*301=90601 --> 06
625*625=390625 --> 06
13
Cuadro comparativo
Búsqueda lineal Búsqueda binaria
Búsqueda por transformación de claves (Hashing)
Truncamiento Plegamiento Aritmética modular Mitad del cuadrado
Orden del vector
Este método de búsqueda
no requiere ningún
requisito por parte del
vector.
Requiere que el vector se
encuentre ordenado para
realizar la búsqueda.
Los registros del campo clave no necesitan estar ordenados de acuerdo a los valores del campo clave.
Características
Toma el valor a encontrar
y lo compara con cada
uno de los valores hasta
que lo encuentra o
termina de leer el vector
Examina primero el
elemento central del vector,
comparándolo si no es
divide el vector y sigue con
las subpartes, hasta que
encuentra el valor o termine
el vector.
Ignora parte de la
clave y utiliza la
parte restante
directamente como
índice
consiste en la partición
de la clave en
diferentes partes y la
combinación de las
partes en un modo
conveniente (a menudo
utilizando suma o
Multiplicación) para
obtener el índice.
Convierte la clave a un entero,
se divide por el tamaño del
rango del índice y toma el resto
como resultado. La función que
se utiliza es el MOD(módulo o
resto de la división entera).
Consiste en calcular el
cuadrado de la clave x.
La función de conversión se
define como: H(x)=c
Donde c se obtiene
eliminando dígitos a ambos
lados de x2
Excepciones
No encontrar en el vector
el valor a buscar.
No encontrar en el vector el
valor a buscar.
Cuando existen
claves diferentes y
los índices
obtenidos son
iguales en
diferentes
búsquedas
Cuando la última parte
que depende del largo
del número, si es par y
las divisiones sea
número impar quedara
la última división
diferente, lo mismo en
caso contrario y según
como se definido el
algoritmo.
Cuando el vector es de un
tamaño definido y el resultado
es mayor que ese tamaño se le
resta el mismo.
Cuando la clave a ordenar es
impar se toma el digito del
medio y el anterior o se
puede tomar el siguiente,
según sea definido el
algoritmo.
14
Conclusión
Debido a las propiedades reversibles que caracterizan a la aritmética
modular, es posible utilizarla en operaciones de cifrado y descifrado, al tener su
función inversa, pudiendo lograr tanto la codificación y decodificación de
información. Podemos darnos cuenta de la importancia que presenta la aritmética
modular en la seguridad, en el ámbito de la información. Es interesante también
como se complementa con las operaciones matemáticas.
En este trabajo de investigación abordamos el tema de la aritmética modular,
en conjunto con otros temas relacionados con los algoritmos de búsqueda,
exponiendo ejemplos y dando un claro ejemplo de su funcionamiento.