1. INGENIERIA EN INFORMATICA
Análisis de algoritmos
Mitad del cuadrado
Asignatura: Análisis de algoritmos
Integrantes: Eduardo Leiva
Jonathan García
Sergio Ormeño
Docente: Pilar Pardo H.
Fecha: 16/04/2014
2. 1
Contenido
Introducción................................................................................................................................. 2
Algoritmos de Búsqueda ........................................................................................................... 3
Búsqueda Binaria:...................................................................................................................... 3
Búsqueda Lineal:........................................................................................................................ 3
Hashing........................................................................................................................................ 3
Truncamiento: ............................................................................................................................. 4
Plegamiento: ............................................................................................................................... 5
Aritmética Modular: .................................................................................................................... 5
Mitad del Cuadrado:................................................................................................................... 6
Caso Promedio ........................................................................................................................... 7
Peor Caso.................................................................................................................................... 7
Tratamiento de colisiones: ........................................................................................................ 8
Sondeo lineal............................................................................................................................... 8
Doble hashing ............................................................................................................................. 9
Encadenamiento de sinónimos ................................................................................................ 9
Direccionamiento por cubetas................................................................................................ 10
Cuadro comparativo de los métodos de búsqueda de un algoritmo................................ 10
Ventajas y Desventajas del Hashing..................................................................................... 11
Comportamiento de un Algoritmo .......................................................................................... 11
Ventajas y desventajas de los algoritmos ............................................................................ 11
Conclusión................................................................................................................................. 13
3. 2
Introducción
Los algoritmos son preciados procesos que nos hacen en si la vida un poco más
ordenada a nivel de los que somos programadores o estamos inmersos en el mundo
de la informática, claro está, existen los creadores de los algoritmos y aquellos que
gozan del uso de estos en diferentes casos, La ciencia de un algoritmo en si es
simplificar un problema en base a un conjunto de pasos que nos permitan resolver
algo o satisfacer una necesidad. Pero, ¿cuantos tipos de algoritmos existen? ¿Solo
nos limita a una cosa a la vez? ¿Cómo es que logran resolver algo de manera
eficiente? ¿Que utilizan para su funcionamiento? Interrogantes como estas serán
evaluadas dentro de este informe, en donde se detallara en base a conocimientos
previos adquiridos en clases la temática de los algoritmos de Búsqueda, en este caso,
repasando la mayoría de los más usados actualmente, los de más demanda, pero en
si dejándonos un poco más de explicación sobre el tema algoritmo que nos convoca,
“Mitad de Cuadrado” o “función cuadrática”.
4. 3
Algoritmos de Búsqueda
¿Qué es una Búsqueda a nivel de análisis de algoritmos?
Es una operación que busca un elemento X entre un conjunto de estos almacenados
ya sea de manera digital o simplemente de manera manual.
Búsqueda Binaria:
Para utilizar la búsqueda binaria debemos tener la lista previamente ordenada de
acuerdo al valor de la clave y conocer el número total de registros. La búsqueda
binaria reduce el tiempo de búsqueda considerablemente ya que disminuye las
iteraciones.
Está altamente recomendado para buscar en listas de gran tamaño. Por ejemplo, en
uno conteniendo 50.000.000 elementos, realiza como máximo 26 comparaciones (en
el peor de los casos). Para implementar este algoritmo se compara el elemento a
buscar con un elemento cualquiera de la lista, si el valor de éste es mayor que el del
elemento buscado se repite el procedimiento en la parte de la lista que va desde el
inicio hasta el elemento tomado, en caso contrario se toma la parte de la lista que va
desde el elemento tomado hasta el final. De esta manera obtenemos intervalos cada
vez más pequeños, hasta que se obtenga un intervalo indivisible. Si el elemento no se
encuentra dentro de este último entonces se deduce que el elemento buscado no se
encuentra en toda la lista.
Búsqueda Lineal:
La búsqueda secuencial se utiliza normalmente cuando la lista no está ordenada o no
se puede ordenar previamente. Consiste en buscar el elemento llamado clave
comparándolo con cada elemento de la lista (vector) hasta encontrarlo, o hasta que se
llegue al final.
Hashing
¿Qué es Hashing?
Esta es una función que consiste en transformar claves numéricas o alfanuméricas en
direcciones o índices de un vector. No es necesario que los elementos de la clave
estén ordenados para poder realizar este tipo de búsqueda. Existen más, pero se
contemplaran en este informe 4 métodos de transformación de claves que aún siguen
en uso: Truncamiento, plegamiento, aritmética modular y mitad del cuadrado.
5. 4
Haciendo un poco de historia, el término de hash (apodado Hashing un tiempo más
tarde) proviene de una analogía que cuyo significado en ingles de dicha palabra se
aplica al mundo real como el “picar y mesclar”. Donal Knuth afirma que H.P Luhn
(empleado de IBM) fue el primero en utilizar el concepto en un memorándum fechado
en enero de 1953, aun así se desconoce de su uso hasta 10 años después cuando se
hizo masivo mediante un algoritmo creado y apodado SHA-1, este algoritmo se
basaba en una función de división que tomaba palabras y las dividía usando funciones
matemáticas seleccionadas especialmente para el lenguaje que interpretaba y tomaba
por entrada.
Truncamiento:
En este método se ignora parte de la clave y se deja la parte restante como índice.
Ejemplos:
6. 5
Plegamiento:
El plegamiento en si se puede definir en base a dos puntos importantes:
o Se encarga de crear una partición de la clave en diferentes partes y
combinarlas.
o Todas las partes, a excepción de la última, deben tener el mismo número de
dígitos que el tamaño del vector.
Ejemplos:
Aritmética Modular:
Este método convierte la clave en un número 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).
Fórmula: H(x)= x MOD m
Ejemplos:
7. 6
Mitad del Cuadrado:
El Método del Cuadrado Medio de von Neumann consistía en el uso de un algoritmo
en el cual al inicio se introduce un número cualquiera conformado por 10 dígitos, luego
se calcula el cuadrado de ese número inicial, a continuación se toman exactamente los
10 dígitos ubicados en la mitad del número resultante, y ese número conformado por
los 10 dígitos se toma como un nuevo número aleatorio que sirve para engrosar la
secuencia aleatoria generada, al cual posteriormente se le puede aplicar de nuevo el
algoritmo del cuadrado medio para así obtener sucesivamente más números
aleatorios.
El esquema de funcionamiento del algoritmo del Método del Cuadrado Medio
propuesto por John von Neumann es el siguiente:
Es decir en esta técnica, la llave es elevada al cuadrado, después algunos dígitos
específicos se extraen de la mitad del resultado para constituir la dirección relativa. Si
se desea una dirección de n dígitos, entonces los dígitos se truncan en ambos
extremos de la llave elevada al cuadrado, tomando n dígitos intermedios. Las mismas
posiciones de n dígitos deben extraerse para cada llave.
El tamaño de los dígitos a escoger seria n
8. 7
En el caso que la cifra resultante sea par:
Los números centrales del resultado corresponden a la dirección.
En caso de que la cifra sea impar:
Se toma el dígito central y el anterior a ese dígito.
Ejemplos:
Lo que cabe señalar que el tamaño del vector no afecta directamente a la aplicación
del método, pero afecta al tiempo de ejecución de la búsqueda. Produciendo que se
ocupe más espacio en memoria.
Caso Promedio: que el vector este con su índice vacío, así mismo que el método
otorge una clave con una posición que se encuentre desocupada para así seguir
llenando sin problemas ni colisiones.
Peor Caso: que el índice (inicio) y la cola (final) estén ocupadas, que no se encuentre
una posición de acuerdo a la clave obtenida y que el algoritmo se caiga, crashee o
simplemente ocupe recursos al generar un loop infinito (dado que no habrá respuesta).
9. 8
Tratamiento de colisiones:
Algunas de las funciones hash presentan colisiones, es por eso que se debe saber
qué hacer cuando a dos elementos diferentes les corresponde el mismo índice.
¿Qué es una colisión?
Es cuando la función hash obtiene una misma dirección para dos claves diferentes.
Al presentarse una colisión se requiere realizar un proceso adicional con el fin de
encontrar una posición para la clave, cuando la función hash logra evitar que se
produzcan colisiones se denomina Hashing perfecto.
Para el tratamiento de colisiones existen 2 métodos:
- Direccionamiento abierto:
Se encuentra entre dirección de origen para K2 dentro del archivo.
- Separación de desborde (Área de desborde):
Se encuentra una dirección para K2 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 dirección de origen
Sondeo lineal
Es una técnica de direccionamiento abierto. Este es un proceso de búsqueda
secuencial desde la dirección de origen para encontrar la siguiente localidad, también
conocida como método de desbordamiento consecutivo.
Para almacenar un registro por Hashing con sondeo lineal, la dirección no debe caer
fuera del límite del archivo. En lugar de terminar cuando el límite del espacio de
dirección se alcanza, se regresa al inicio del espacio y sondeamos desde ahí. Por lo
que debe ser posible detectar si la dirección base ha sido encontrada de nuevo, lo cual
indica que el archivo está lleno y no hay espacio para la llave.
10. 9
Para la búsqueda de un registro por Hashing con sondeo lineal, los valores de llave de
los registros encontrados en la dirección 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.
Doble Hashing
En esta técnica se aplica una segunda función 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 sobre flujo independiente; de cualquier modo, será
necesario algún método de solución si ocurren colisiones durante el segundo hash.
La ventaja del método de separación de desborde es que reduce la situación de una
doble colisión, la cual puede ocurrir con el método de direccionamiento abierto, en el
cual un registro que no está almacenado en su dirección de origen desplazará a otro
registro, el que después buscará su dirección de origen. Esto puede evitarse con
direccionamiento abierto, simplemente moviendo el registro extraño a otra localidad y
almacenando al nuevo registro en la dirección de origen ahora vacía.
Puede ser aplicado como cualquier direccionamiento abierto o técnica de separación
de desborde.
Para ambas métodos para la solución de colisiones existen técnicas para mejorar su
desempeño como:
Encadenamiento de sinónimos
Una buena manera de mejorar la eficiencia de un archivo que utiliza el cálculo de
direcciones, sin directorio auxiliar para guiar la recuperación de registros, es el
encadenamiento de sinónimos.
Mantener una lista ligada de registros, con la misma dirección de origen, no reduce el
número de colisiones, pero reduce los tiempos de acceso para recuperar los registros
que no se encuentran en su localidad de origen. El encadenamiento de sinónimos
puede emplearse con cualquier técnica de solución de colisiones.
Cuando un registro debe ser recuperado del archivo, sólo los sinónimos de la llave
objetivo son accesados.
11. 10
Direccionamiento por cubetas
Otro enfoque para resolver el problema de las colisiones es asignar bloques de
espacio (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. Los métodos para el
problema de sobrecupo son básicamente los mismos que los métodos para resolver
colisiones.
Cuadro comparativo de los métodos de búsqueda de un algoritmo
12. 11
Ventajas y Desventajas del Hashing
Ventajas:
o Se pueden usar los valores naturales de la llave, puesto que se traducen
internamente a direcciones fáciles de localizar
o Se logra independencia lógica y física, debido a que los valores de las llaves
son independientes del espacio de direcciones
o No se requiere almacenamiento adicional para los índices
Desventajas:
o No pueden usarse registros de longitud variable
o El archivo no está clasificado
o No se permiten claves repetidas
o Solo se permite acceso por una sola llave
Comportamiento de un Algoritmo
Caso Peor: mayor número posible de instrucciones ejecutadas por el algoritmo.
Caso Mejor: menor número posible de instrucciones ejecutadas por el algoritmo.
Caso Medio o promedio: número de instrucciones igual a la cantidad de instrucciones
ejecutadas por el algoritmo.
Ventajas y desventajas de los algoritmos
Los algoritmos son la esencia de la informática, son uno de los centros de interés de
muchas, si no todas, de las áreas del campo de la informática.
o Puedes trabajar en orden.
o Te redacta en orden paso a paso lo que hay que hacer.
o Ayuda a resolver más fácil y rápido los problemas.
o Disminuye sensiblemente el riesgo de errores.
o Favorece el obtener el máximo de información.
13. 12
Desventajas de un algoritmo:
o Hay textos que desarrollan los algoritmos, mediante diversos tipos de
programas, por ejemplo: el lenguaje de programación C++, pero para
comprender las letras deben poseer al menos un año de experiencia en ese
lenguaje de programación de alto y bajo nivel.
o Muchos algoritmos interesantes llevan implícitos complicados métodos de
organización de los datos utilizados en el calendo.
o Con frecuencia sucede que muchos de los algoritmos que se van a utilizar son
fáciles de implementan una vez que se ha descompuesto el programa, sin
embargo, en la mayor parte de los casos, existen unos pocos algoritmos cuya
elección es crítica porque su ejecución ocupara la mayoría de los recursos del
sistema.
o La elección del mayor algoritmo para una tarea particular puede ser un proceso
muy complicado y con frecuencia conllevara un análisis matemático sofisticado.
o Actualmente se está estudiando en la informática, como seleccionar el
algoritmo que conduzca a la mejor implementación pues para la mayoría de los
problemas existen varios algoritmos diferentes.
14. 13
Conclusión
Se han analizado las técnicas o métodos más utilizados en el ámbito de
posicionamiento, búsqueda y transformación de claves en relación a vectores, dado
esto se puede inferir a que cada método tiene su propio modo de operar en base a
algoritmos que dependiendo de lo que hagan nos brindaran una respuesta más rápida
y eficiente a lo que buscamos, según sea el topo dato alfanumérico o carácter a
posicionar o buscar, esto nos lleva a nuestro tema, “mitad de cuadrado” o “función
cuadrática” un método de transformación derivado como un sub método del Hashing el
cual nos ayuda a posicionar dentro de un arreglo vector o matriz una clave que según
sea la posición ira donde calce, dado esto, los métodos se complementan entre otros,
pero se concluye que todos son dependientes en su mayoría del truncamiento al
momento de querer enfrentar colisiones según sea el tamaño del vector y de la clave a
posicionar, búsqueda lineal y binaria solo dan con un número que se desee, entra en
el ámbito búsqueda, por lo tanto se diferencian del Hashing puesto que es un método
de transformación y a nuestro entender, el que entra primero en acción es el Hashing
para luego tener algo que buscar.