PROYECTO FINAL. Tutorial para publicar en SlideShare.pptx
Informe analisis de algoritmos
1. 16-4-2014 Algoritmos de
búsqueda y
ordenamiento
Tema Plegamiento
Juan Monsalve Constanzo, Valentina Torres Riquelme
PROFESORA PILAR PARDO HIDALGO
2. Contenido
Introducción....................................................................................................................................... 2
Tipos de busquedas......................................................................................................................... 3
1 Búsqueda Lineal........................................................................................................................ 3
2 Búsqueda binaria ...................................................................................................................... 4
3 Búsqueda en textos.................................................................................................................. 5
4 Arboles de búsqueda................................................................................................................ 6
5 Búsqueda por transformación de Claves (Hashing)............................................................ 7
Funciones de hash........................................................................................................................... 8
Truncamiento ................................................................................................................................ 8
Aritmética modular ....................................................................................................................... 9
Mitad del cuadrado....................................................................................................................... 9
Plegamiento................................................................................................................................... 9
Ventajas plegamiento: ........................................................................................................... 10
Desventajas plegamiento:..................................................................................................... 10
Ventajas de la búsqueda por hashing..................................................................................... 10
Desventajas de la búsqueda por hashing .............................................................................. 10
Costos de la búsqueda por hashing........................................................................................ 11
Algunos ejemplos del método de plegamiento...................................................................... 11
Análisis peor, mejor y caso promedio ..................................................................................... 11
Métodos para resolver colisiones ................................................................................................ 11
Área de Desborde: ..................................................................................................................... 11
Sondeo lineal: ............................................................................................................................. 12
Doble Hashing: ........................................................................................................................... 12
Encadenamiento de Sinónimos: .............................................................................................. 12
Direccionamiento por Cubetas:................................................................................................ 12
1
3. Introducción
En el presente informe se encuentran diferentes métodos de búsquedas de datos
almacenados y de ordenamiento, se centra en el método de hashing de
plegamiento, pero para analizarlo de mejor manera debemos primero de
comprender los demás métodos, cada uno explicando brevemente como operan.
Al analizar el método de plegamiento se presentan problemas llamados colisiones,
estas colisiones pueden ser tratadas con diferentes métodos, los cuales son
mencionados y explicados, dentro de los cuales se deberá elegir el mejor para cada
caso, ya que es fundamental realizar la elección indicada para optimizar la posterior
búsqueda de los datos.
2
4. Tipos de búsquedas
1. Búsqueda Lineal
2. Búsqueda Binaria
3. Búsqueda en Textos
4. Arboles de búsqueda.
5. Búsqueda por transformación de Claves (Hashing)
1 Búsqueda Lineal
La situación óptima es que el registro buscado sea el primero en ser examinado. El
peor caso es cuando las llaves de todos los n registros son comparados con k (lo
que se busca). El caso promedio es n/2 comparaciones.
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 emplearse para hacer las búsquedas. Si los valores de la
llave no son únicos, para encontrar todos los registros con una llave particular, se
requiere buscar en toda la lista.
Principales Aplicaciones.
Los archivos secuenciales son típicamente utilizados en aplicaciones de proceso de
lotes Y son óptimos para dichas aplicaciones si se procesan todos los registros. La
organización secuencias de archivos es la única que es fácil de usar tanto en disco
como en cinta.
Un ejemplo claro para utilizar esta técnica de búsqueda es cuando se tiene una
base de datos no muy grande en un negocio pequeño donde los registros más
usados son llamados con frecuencia, es aquí donde esta técnica es fuerte, ya que
se aplica a un patrón de búsqueda pequeño, sencillo y manejable; es decir como si
fuera una descripción, es uno tras otro.
3
5. 2 Búsqueda binaria
Si los elementos sobre los que se realiza la búsqueda están ordenados, entonces
podemos utilizar un algoritmo de búsqueda mucho más rápido que el secuencial, la
búsqueda binaria. El algoritmo consiste en reducir paulatinamente el ámbito de
búsqueda a la mitad de los elementos, basándose en comparar el elemento a
buscar con el elemento que se encuentra en la mitad del intervalo y en base a esta
comparación:
• Si el elemento buscado es menor que el elemento medio, entonces sabemos
que el elemento está en la mitad inferior de la tabla.
• Si es mayor es porque el elemento está en la mitad superior.
• Si es igual se finaliza con éxito la búsqueda ya que se ha encontrado el
elemento.
Se puede aplicar tanto a datos en listas lineales (Vectores, Matrices, etc.) como en
árboles binarios de búsqueda. Los prerrequisitos principales para la búsqueda
binaria son:
• La lista debe estar ordenada en un orden específico de acuerdo al valor de
la llave.
• Debe conocerse el número de registros.
La búsqueda binaria consiste en dividir el array por su elemento medio en dos
subarrays más pequeños, y comparar el elemento con el del centro. Si coinciden, la
búsqueda se termina. Si el elemento es menor, debe estar (si está) en el primer
subarray, y si es mayor está en el segundo.
Suponiendo que la lista está almacenada como un array, los índices de la lista son:
Menor = 0 y mayor = n-1 y n es el número de elementos del array, los pasos a
seguir:
1. Calcular el índice del punto central del array
Central = (menor + mayor)/2 (división entera)
2. Comparar el valor de este elemento central con la clave:
Clave = central, si es así se termina la búsqueda.
Clave < central, se repite el proceso en la primera mitad.
Clave > central, se repite el proceso en la segunda mitad.
4
6. 3 Búsqueda en textos
La búsqueda de patrones en un texto es un problema muy importante en la práctica.
Sus aplicaciones en computación son variadas, como por ejemplo la búsqueda de
una palabra en un archivo de texto o problemas relacionados con biología
computacional, en donde se requiere buscar patrones dentro de una secuencia de
ADN, la cual puede ser modelada como una secuencia de caracteres (el problema
es más complejo que lo descrito, puesto que se requiere buscar patrones en donde
ocurren alteraciones con cierta probabilidad, esto es, la búsqueda no es exacta).
Se utilizan las siguientes convenciones:
• n denotará el largo del texto en donde se buscará el patrón, es decir, texto =
a1 a2 ... an.
• m denotará el largo del patrón a buscar, es decir, patrón = b1 b2 ... bm.
Dentro podemos encontrar:
Algoritmo de fuerza bruta
Se alinea la primera posición del patrón con la primera posición del texto, y se
comparan los caracteres uno a uno hasta que se acabe el patrón, esto es, se
encontró una ocurrencia del patrón en el texto, o hasta que se encuentre una
discrepancia.
Algoritmo Boyer-Moore
Hasta el momento, los algoritmos de búsqueda en texto siempre comparan el patrón
con el texto de izquierda a derecha. Sin embargo, suponga que la comparación
ahora se realiza de derecha a izquierda: si hay una discrepancia en el último
carácter del patrón y el carácter del texto no aparece en todo el patrón, entonces
éste se puede deslizar m posiciones sin realizar ninguna comparación extra. En
particular, no fue necesario comparar los primeros m-1 caracteres del texto, lo cual
indica que podría realizarse una búsqueda en el texto con menos de n
comparaciones; sin embargo, si el carácter discrepante del texto se encuentra
dentro del patrón, éste podría desplazarse en un número menor de espacios.
5
7. 4 Arboles de búsqueda
Árbol binario
La mayoría de los árboles binarios son de búsqueda
Un árbol binario no vacío, de raíz R, es un árbol binario de búsqueda si:
En caso de tener subárbol izquierdo, la raíz R debe ser mayor que el valor máximo
almacenado en el subárbol izquierdo, y que el subárbol izquierdo sea un árbol
binario de búsqueda.
En caso de tener subárbol derecho, la raíz R debe ser menor que el valor mínimo
almacenado en el subárbol derecho, y que el subárbol derecho sea un árbol binario
de búsqueda.
Para una fácil comprensión queda resumido en que es un árbol binario que cumple
que el subárbol izquierdo de cualquier nodo (si no está vacío) contiene valores
menores que el que contiene dicho nodo, y el subárbol derecho (si no está vacío)
contiene valores mayores.
Para estas definiciones se considera que hay una relación de orden establecida
entre los elementos de los nodos. Que cierta relación esté definida, o no, depende
de cada lenguaje de programación. De aquí se deduce que puede haber distintos
árboles binarios de búsqueda para un mismo conjunto de elementos.
La altura h en el peor de los casos siempre el mismo tamaño que el número de
elementos disponibles. Y en el mejor de los casos viene dada por la expresión h =
ceil(log_2(c+1)), donde ceil indica redondeo por exceso.
El interés de los árboles binarios de búsqueda (ABB) radica en que su recorrido en
inorden proporciona los elementos ordenados de forma ascendente y en que la
búsqueda de algún elemento suele ser muy eficiente.
Dependiendo de las necesidades del usuario que trate con una estructura de este
tipo, se podrá permitir la igualdad estricta en alguno, en ninguno o en ambos de los
subárboles que penden de la raíz. Permitir el uso de la igualdad provoca la aparición
de valores dobles y hace la búsqueda más compleja.
Un árbol binario de búsqueda no deja de ser un caso particular de árbol binario
6
8. 5 Búsqueda por transformación de Claves (Hashing)
Hasta ahora las técnicas de localización de registros vistas, emplean un proceso de
búsqueda que implica cierto tiempo y esfuerzo. El método de transformación de
claves nos permite encontrar directamente el registro buscado en tablas o archivos
que no se encuentran necesariamente ordenados, en un tiempo independiente de
la cantidad de datos.
A diferencia de una búsqueda indexada por claves ordinaria, donde usamos el valor
de las claves como índices de un arreglo y necesitamos indispensablemente que
los mismos sean enteros distintos dentro de un rango equivalente al rango de la
tabla, utilizar el método de Hashing nos permite manejar aplicaciones de búsqueda
donde no tenemos claves con características tan limitadas. El resultado es un
método de búsqueda completamente diferente a los métodos basados en
comparaciones, ahora en vez de navegar por las estructuras comparando palabras
clave con las claves en los items, tratamos de referenciar items en una tabla
directamente haciendo operaciones aritméticas para transformar claves en
direcciones de la tabla. Esto último se logra implementando una Función Hash, que
se va a encargar de dicha transformación.
Idealmente, todas las claves deberían corresponder con direcciones diferentes,
pero es muy frecuente que dos o más claves diferentes sean transformadas a la
misma dirección, cuando esto pasa, se dice que se presenta una Colisión. Es por
eso que también se debe implementar algún proceso de resolución de Colisiones,
que se va a encargar de tratar tales situaciones. Uno de los métodos de resolución
de colisiones que existen usa Listas enlazadas y se lo denomina “encadenamiento
directo” o “Hashing abierto” el cual es muy útil en situaciones dinámicas, donde el
número de elementos es difícil de predecir por adelantado.
7
9. Funciones de hash
La función hash es la que se va a encargar de transformar las claves en direcciones
de la tabla. Se puede definir la “función ideal” como aquella que distribuya a todos
los elementos lo más uniformemente posible sobre la gama de valores índice, es
decir, si tenemos una tabla que puede almacenar N items, entonces requerimos de
una función que transforme claves a enteros en el rango [0, N-1].
Existen distintas funciones de hashing:
Truncamiento
Consiste en tomar algunos dígitos de la clave y formar con ellos una dirección. Este
método es de los más sencillos, pero es también de los que ofrecen menos
uniformidad en la distribución de las claves.
Sea K la clave del dato a buscar. K está formada por los dígitos d1, d2, ... , dn. La
función hash queda definida por la siguiente fórmula:
H(K) = elegirdígitos (d1d2...dn) + 1)
La elección de los dígitos es arbitraria. Podrían tomarse los dígitos de las posiciones
impares o de las pares. Luego podría unírseles de izquierda a derecha o de derecha
a izquierda. La suma de una unidad a los dígitos seleccionados es para obtener un
valor entre 1 y 100.
En todas las funciones hash anteriores se presentan ejemplos de claves numéricas.
Sin embargo, en la realidad las claves pueden ser alfabéticas o alfanuméricas. En
general, cuando aparecen letras en las claves se suele asociar a cada una un entero
a efectos de convertirlas en numéricas.
A B C D ... Z
01 02 03 04 …27
Si por ejemplo la clave fuera ADA, su equivalente numérica sería 010401. Si hubiera
combinación de letras y números, se procedería de la misma manera. Por ejemplo,
dada una clave Z4F21, su equivalente numérica sería 2740621. Otra alternativa
sería, para cada carácter, tomar el valor decimal asociado según el código ASCII.
Una vez obtenida la clave en su forma numérica, se puede utilizar normalmente
cualquiera de las funciones.
8
10. Aritmética modular
U na función de dispersión que utiliza la aritmética modular genera valores dispersos
calculando el residuo de la división entera entre la clave x y el tamaño de la tabla m.
h(x) = x mod m
Mitad del cuadrado
Esta técnica de obtener direcciones dispersas consiste, en primer lugar, en calcular
el cuadrado de la clave x, y a continuación extraer de x^2, los dígitos que se
encuentran en ciertas posiciones. El número de dígitos a extraer depende del rango
de dispersión que se desea obtener. Así, si el rango es de 0 a 999, se extraen tres
dígitos, siempre, aquellos que están en las mismas posiciones.
Un problema potencial, al calcular x^2, es que sea demasiado grande y exceda el
máximo rango del valor que se está utilizando. Es importante, al aplicar este método
de dispersión, utilizar siempre las mismas posiciones para todas las claves.
Plegamiento
La técnica del plegamiento se utiliza cuando el valor entero del campo clave elegido
sea demasiado grande, pudiendo ocurrir que no pueda ser almacenado en memoria.
Consiste en partir la clave x en varias partes x1, x2, x3, …, xn, y la combinación de
las partes de un modo conveniente (a menudo sumando las partes) da como
resultado la dirección del registro.
Cada parte xi, con la excepción a lo sumo de la última, tiene el mismo número de
dígitos que la dirección especificada.
h(x) = x1 + x2 + x3 + … + xr
En la operación que se realiza para el cálculo de la función hash, se desprecian los
dígitos más significativos que se obtienen del acarreo. Generalmente se utiliza esta
técnica para transformar una clave muy grande en otra más pequeña, y a
continuación se aplica la función hash de aritmética modular.
La suma de las partes puede realizarse de dos formas
• El plegado por desplazamiento consiste en sumar las partes directamente.
• Si la claves es una cadena de caracteres, los dígitos de cada carácter vienen
determinados por el valor decimal de la secuencia de cotejo correspondiente (ASCII,
EBCDIC, etc.).
9
11. Ventajas plegamiento:
Puede ser la técnica más fácil de calcular.
Desventajas plegamiento:
Produce resultados bastante erráticos, a menos que la longitud de la llave sea
aproximadamente igual a la longitud de la dirección.
Se pueden producir colisiones y necesitar métodos para resolverlas.
Posee un espacio de tamaño fijo. Aumentar el tamaño del archivo relativo creado al
usar una de estas funciones, implica cambiar la función hash, para que se refiera a
un espacio mayor y volver a cargar y reorganizar de nuevo los datos.
El método de plegamiento también incorpora las ventajas y desventajas de las
funciones de hash:
La eficiencia de una función hash depende de:
1. La distribución de los valores de llave que realmente se usan
2. El número de valores de llave que realmente están en uso con respecto al tamaño
del espacio de direcciones
3. El número de registros que pueden almacenarse en una dirección dada sin causar
una colisión
4. La técnica usada para resolver el problema de las colisiones
Ventajas de la búsqueda por hashing
1. Se pueden usar los valores naturales de la llave, puesto que se traducen
internamente a direcciones fáciles de localizar.
2. Se logra independencia lógica y física, debido a que los valores de las llaves son
independientes del espacio de direcciones.
3. No se requiere almacenamiento adicional para los índices.
Desventajas de la búsqueda por hashing
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
10
12. Costos de la búsqueda por hashing
• Tiempo de procesamiento requerido para la aplicación de la función hash
• Tiempo de procesamiento y los accesos E/S requeridos para solucionar las
colisiones.
Algunos ejemplos del método de plegamiento.
Si dividimos los números de 8 cifras en 3, 3 y 2 cifras y se suman, dará otro número
de tres cifras (y si no, se cogen las tres últimas cifras):13000000 -->
130=130+000+00
• 12345678 --> 123+456+78=657
• 71140205 --> 118 --> 711+402+051=118
• 13602499 --> 136+024+99=259
• 25000009 --> 250+000+09=259
Análisis peor, mejor y caso promedio
• El peor caso para una tabla hash y para un árbol binario es el de la lista
enlazada. Esto ocurre cuando todas las claves se dispersan al mismo slot.
• El mejor caso para una tabla de hash es cuando todas las claves se
dispersan en distintos slots.
• El caso promedio de una tabla de hash ocurre cuando en ocasiones las
claves producen colisiones.
Métodos para resolver colisiones
Área de Desborde:
La forma más sencilla de resolver las colisiones es simplemente crear para cada
dirección de la tabla, una lista encadenada de todos los elementos cuyas llaves
mapean al mismo índice.
Cuando se busque una clave se tendrá que recorrer la lista que le corresponda
hasta encontrar el elemento buscado. El factor de carga será l = N/M, que va a ser
el largo promedio de cada lista.
(N = número de elementos insertados, M = cantidad de listas)
Las listas pueden dejarse desordenadas o bien mantenerlas ordenadas. Lo más
frecuente es usar listas desordenadas porque es más fácil de implementar, y es más
eficiente, vamos a tener una Inserción de orden constante y una búsqueda
proporcional a l.
11
13. Sondeo lineal:
Cuando se presenta una colisión, simplemente se busca, avanzando de a un lugar
por vez, el próximo lugar vacío en la tabla, y se guarda ahí la clave si no está
repetida.
La inspección comienza en la posición a la cual lleva la función hash, ahí se tienen
tres posibles situaciones: si la posición actual de la tabla contiene un ítem cuya clave
es igual a la que buscamos, entonces tenemos un hit, si la posición de la tabla está
vacía, tenemos una pérdida, de otra manera seguimos con la próxima posición en
el siguiente índice, continuando (volviendo al principio de la tabla si llegamos al final)
hasta que encontremos o una pérdida o un hit.
Doble Hashing:
El cual una segunda función es usada para manejar la resolución de colisiones. La
segunda función debe ser elegida con cuidado, de otra manera el programa puede
no funcionar. No puede haber ningún caso en que la segunda función se evalué a
cero, ya que esto generaría un ciclo infinito, también es importante que el valor de
la segunda función sea relativamente primo al tamaño de la tabla, de otra manera
las secuencias serían muy cortas.
Encadenamiento de Sinónimos:
Es la manera de mejorar la eficiencia de un archivo relativo que utiliza calculo de
direcciones, sin directorio auxiliar para guiar la recuperación de registros ,mantiene
una lista de registros, con la misma dirección de origen, no reduce el numero de
colisiones, pero reduce los tiempos de acceso para recuperar los registros que no
se encuentran en su localidad de origen.
Se puede utilizar con el método abierto y de desborde.
Siempre trabaja mejor que la solución de colisiones sin encadenamiento de
sinónimos al menos que se use el método de búsqueda en el directorio para
registrar donde están realmente almacenados los registros.
Direccionamiento por Cubetas:
Es un bloque de espacio o cubetas que pueden acomodar ocurrencias múltiples de
registros, en lugar de asignar celdas individuales a registros.
Cuando una cubeta es desbordada, alguna nueva localización deberá ser
encontrada para el registro , cada cubeta principal generalmente tendrá un
apuntador a una cadena de registros, en el área de sobrecupo, que tendrían que
hacer almacenados en la cubeta principal, pero que terminaron, en su lugar, en una
cubeta de sobrecupo.
Una cubeta de sobrecupo podría acomodar registros que fueran direccionados
hacia diferentes cubetas principales
12