Tarea 4 Hashing Jérémy Barbay, Mauricio Quezada 2011-05-11 Miércoles → 2011-05-25 Miércoles CC4102: Diseño y Análisis Profesor: Jérémy Barbay Auxiliar: Mauricio Quezada Ayudantes: David Contreras Sergio Villarroel de Algoritmos – 2011 <[email protected]> <[email protected]> <[email protected]> <[email protected]> Resumen El objetivo de esta tarea es comparar el rendimiento de estructuras de datos para al tipo de dato abstracto ”diccionarios”, y en particular entre soluciones que se limitan a comparaciones y soluciones que aprovechan la finitud del dominio. En particular: Se consideran cuatro soluciones: (búsqueda binaria, búsqueda por interpolación, Hashing cerrado y abierto) y dos experimentos (arreglo ordenado regular e irregular). En 2 instancias diferentes: distribución uniforme y exponencial de los valores de los arreglos. Con 100 instancias por experimento, agregando elementos de 8 dominios crecientes. Reutilizando su trabajo de las tareas 1, 2 y 3, implementando las estructuras de datos, evalúandolas en la práctica. Presentando un reporte completo de 4 páginas y 4 gráficos 2D (con hipótesis, diseño experimental, descripción de las medidas de rendimiento elegidas, presentación e interpretación de los resultados, conclusión). Entregando tanto como su implementación (con readme, makefile, etc), como el informe por medio de U-Cursos. Y el informe impreso en secretarı́a del departamento hasta las 4pm del dı́a siguiente a la fecha de entrega. 1 1. Descripción de la tarea El objetivo de esta tarea es comparar el rendimiento de algoritmos de búsqueda en conjuntos ordenados en el modelo de comparaciones y afuera de este modelo, tal que estructuras de datos basadas en Hashing. Se consideran cuatros soluciones (búsqueda binaria, búsqueda por interpolación, Hashing cerrado y abierto) y dos experimentos (arreglo ordenado regular e irregular). 2. Estructuras de Datos Se consideran cuatros soluciones para soportar la búsqueda de un elemento x ∈ [0..(N − 1)] en un conjunto de tamaño n: 1. Arreglo ordenado con Búsqueda binaria, que en cada etapa hace una comparación < entre los dos elementos considerados, y hace una comparación = solamente cuando el rango de inserción del elemento x es definido. 2. Arreglo ordenado con Búsqueda por interpolación que usa el valor de x, y los valores de las extremidades del sub-arreglo considerado, para interpolar la próxima posición a comparar con x. 3. Hashing Cerrado, que prueba (h(x) + i × h0 (x)) mód n, para i ∈ [0..n] en un arreglo de tamaño n hasta encontrar x o una posición libre. 4. Hashing Abierto, que construye una simple lista enlazada para cada una de las n posiciones del arreglo. Las estructuras de datos de Hashing usan funciones de hash universales de la forma h(x) = ((a × x + b) mód p) mód n, donde x ∈ [0..(N − 1)], a ∈ [1..p − 1] elegido uniformemente al azar, b ∈ [0..p − 1] elegido uniformemente al azar, p es primo y mas grande que N (dos números primos distinto para el Hashing cerrado). 2 3. Instancias A la diferencia de las tareas precedentes, el elemento buscado sera siempre de rango elegido al azar uniformemente (que corresponde a elegir cualquier de los elementos a dentro del conjunto al azar), y un elemento puede estar presente mas de una vez en la estructura de datos: se trata de calcular la cantidad de ocurrencias del elemento buscado. La diferencia entre los dos experimentos es sobre la distribución del contenido de los conjuntos representados y buscados. Se consideran dos tipos de instancias (que corresponden a dos experimentos distintos): 1. Distribución uniforme: cada elemento x ∈ [0..(N − 1)] tiene la misma probabilidad de estar en el conjunto. 2. Distribución exponencial: cada elemento x de [0..(N −1)] tiene una probabilidad de estar en el conjunto proporcional a 2−x . Los dos tipos de instancias se pueden generar probando para cada valor x ∈ [0..(N − 1)] veces un generador de números aleatorio b ∈ [0, 1] y agregando x al conjunto si b es inferior a la probabilidad querida. Se consideran instancias con n = 101 elementos elegidos dentro de dominios de tamaño N ∈ {102 , 103 , . . . , 109 }. Cada experimentación (i.e. para un tamaño fijo de conjunto y dominio) deberá generar 100 instancias, y sobre los resultados obtenidos se deberá documentar el máximo, mı́nimo, y promedio de las medidas de rendimiento. 4. Medidas de Rendimiento Se considera dos medidas de rendimiento: 1. la cantidad de comparaciones, y 2. el tiempo de ejecución. El reporte debe indicar claramente el proceso de medida del tiempo de ejecución, y si hay correlación o no entre las dos medidas de rendimiento. 3 5. Implementación Se puede elegir el lenguaje de programación de su preferencia, aunque se sugiere Python, Java, C o C++. El idioma de programación debe ser claramente indicado en el reporte. Se debe describir la maquina usada por la experimentación, en términos de: sistema operativo, cantidad de memoria (activa y en caché). cantidad y caracterı́sticas de los procesadores. 6. Reporte El reporte debe seguir los pasos descritos en clase. En particular, el reporte debe permitir de identificar claramente los puntos siguientes: 1. las hipótesis elegidas antes del inicio de la realización del experimento, 2. el diseño experimental, incluyendo los detalles de la implementación de los algoritmos, de la generación de las instancias y la descripción del proceso de medida del tiempo de computación, 3. la presentación de los resultados en forma de una descripción textual, tablas y gráficos en dos dimensiones, 4. la interpretación de los resultados, 5. y, si necesario, conclusiones criticando sus resultados y proponiendo experimentos adicionales. En el caso donde los datos no verifican la hipótesis, no se pide modificar el ciclo de diseño, sino de correctamente identificar el problema y presentarlo en la conclusión (que sea una error en la hipótesis, en el diseño experimental o en su implementación). Se espera que el informe tenga una extensión de 4 páginas, y que incluya 4 gráficos 2D que resuman los resultados más importantes. Si tienen más gráficos, se pueden colocar en la sección Anexos. Se puede elegir el software de redacción de su preferencia, aunque se sugiere el uso de LATEX. El reporte debe ser entregado en U-Cursos en un 4 archivo de formato pdf con el reporte textual, un archivo zip con la totalidad del código usado para los experimentos, más un README de cómo ejecutar el código, de manera que potencialmente se puedan reproducir los experimentos, y entregar una copia impresa del informe en la secretaria de estudio, el dı́a siguiente a la fecha de entrega (hasta las 4 de la tarde). 7. Colaboración y Uso de Librerı́as El proyecto es individual: uno de los objetivos es desarrollar las capacidades de programación de los alumnos. La comunicación entre alumnos sobre el proyecto está autorizada, en limites razonables. En particular, cada alumno debe ser capaz de describir los detalles mas técnicos de las implementaciones y experimentos descritos en su reporte. De igual manera, el uso de librarı́a de software es autorizado solamente si el alumno es capaz de describir los detalles más técnicos de la implementación de todas las funciones involucradas en la librerı́a. Se pedirá una evaluación oral en caso de duda sobre la originalidad del trabajo. 8. Atraso y otros problemas Con la finalidad de dar un feedback antes de la entrega de la tarea siguiente, los ayudantes tienen solamente una semana para corregir las tareas. Por lo tanto, no se admite atrasos en la entrega de tareas, en general. Los atrasos o dificultades para la entrega de las tareas con excusas válidas se negocian un dı́a antes la fecha de entrega, y directamente con el auxiliar encargado de la tarea (definitivamente NO con el profesor del curso). No se aceptan excusas en la fecha de entrega o después. Todo atraso o dificultad para la entrega sin negociación o excusa válida se convierte en un 1 (uno). 5