CC30A Algoritmos y Estructuras de Datos

Prof. Rodrigo Paredes

Tarea 1

Fecha de entrega: martes 27 de agosto. No se aceptarán tareas atrasadas.


Objetivos

En esta tarea se pretende, junto con familiarizar al alumno con Java, entregarle una metodología que le permita: enfrentar un problema, construir un algoritmo que lo resuelva, definir un conjunto de pruebas que permitan analizar alguna característica interesante del problema, realizar los experimentos y por último modelar el comportamiento de la característica de interés.

El problema que vamos a abordar en esta tarea consiste en contar las inversiones de un arreglo. En clases vimos que la cantidad media de inversiones en un arreglo compuesto por elementos distribuidos uniformemente (sin elementos repetidos) es n(n-1)/4. En esta tarea vamos a verificar esto experimentalmente.
 

Descripción de la tarea

Si consideramos el orden ascendente, una inversión en un arreglo de números es cualquier par ordenado (i,j) con la propiedad de que i < j, pero a[i] > a[j] (el par (a[i], a[j] esta "desordenado" en el sentido ascendente). Por ejemplo, el areglo (1, 2, 4, 3, 5) tiene 1 inversión, y el arreglo (5, 1, 2, 3, 4) tiene 4 inversiones. Recuerde que la cantidad de inversiones de un arreglo corresponde a la cantidad de intercambios de elementos que necesita efectuar un algoritmo de ordenación que intercambia elementos adyacentes.

Se van a considerar tres algoritmos de ordenamiento de costo cuadrático:

Estos tres algoritmos se pueden adaptar de modo de, además de ordenar, cuenten exactamente todas las inversiones que tenía el arreglo original (desordenado). Por ejemplo, utilizando burbuja, basta con contar la cantidad de intercambios de elementos que se realicen durante toda la ejecución.

El programa que tendrán que desarrollar para esta tarea consiste en:

  1. Generar un arreglo A = {1, 2, 3, ..., N}
  2. B = desordenar(A)
  3. Copiar el arreglo en tres arreglos auxiliares burB, insB, selB
    1. burB = B,
    2. insB = B
    3. selB = B
  4. ordenar burB con burbuja, y contar la cantidad de inversiones del arreglo original
  5. ordenar insB con inserción, y contar la cantidad de inversiones del arreglo original
  6. ordenar selB con selección, y contar la cantidad de inversiones del arreglo original


Para desordenar los arreglos utilice el siguiente algoritmo:

desordenar (int[] A) {
  n = número de elementos de A
  while (n > 1) {
    j = random(n - 1);
    intercambia A[j] con A[n]
    n--;
  }
}

La metodología mostrada se utilizará con arreglos de distinto tamaño N, y para cada tamaño N se realizarán varias pruebas. De este modo vamos a verificar como aumenta la cantidad promedio de inversiones de un arreglo en función a su tamaño, independiente del algoritmo de ordenación que utilicemos, mediante una técnica de ajuste funcional.

Pruebas


Para cada valor de N, genere 5 arreglos desordenados y calcule el promedio de la cantidad de inversiones de los 5 arreglos de tamaño N para cada algoritmo de ordenación.

Considere N = 1000, 2000, 3000, 4000, ... , 10000.
 

Por último, tabule sus resultados de cantidad de inversiones, muestrelos en gráficos y calcule el ajuste polinomial de acuerdo al siguiente modelo:

p(N) = a · N b

En esta parte tiene que calcular las constantes a y b. Para ello aplican logaritmo a la expresión anterior:

log(p(N)) = log(a) + N log(b)

y luego realizan una regresión lineal sobre esta expresion.


Restricciones

Hints

Ponderación

El informe equivale a un 50% de la nota de tarea.
El código equivale a un 50% de la nota de tarea.

Entrega de la tarea

 
La entrega de la tarea debe incluir un informe escrito donde se describa y documente el programa realizado, y se incluyan ejemplos de entradas y salidas.

El informe debe ser entregado en la Secretaría Docente de Computación (donde Magaly, tercer piso Edificio de Computación, hasta las 17:00 horas del último día de plazo), y el código fuente (junto a un archivo README que explique como compilar) debe ser enviado utilizando el Cursomático de cc30a.

El contenido del informe debe seguir la siguiente pauta común para todas las tareas:
 

  • Portada