tarea 1 viernes analisis

8
Departamento de Ingeniería Informática y Ciencias de la Computación Facultad de Ingeniería Universidad de Concepción Asignatura: Análisis de algoritmos Tarea 1 Integrantes: Pablo Flores Torres Matías Lermanda Sandoval Profesora: María Andrea Rodríguez Tastets Ayudante: Erick Elejalde Sierra Fecha: 20 de Abril de 2015

Upload: pablo-cristobal-flores-torres

Post on 25-Sep-2015

237 views

Category:

Documents


2 download

DESCRIPTION

analisis de algoritmos

TRANSCRIPT

  • Departamento de Ingeniera Informtica y Ciencias de la Computacin

    Facultad de Ingeniera

    Universidad de Concepcin

    Asignatura: Anlisis de algoritmos

    Tarea 1

    Integrantes: Pablo Flores Torres Matas Lermanda Sandoval Profesora: Mara Andrea Rodrguez Tastets Ayudante: Erick Elejalde Sierra Fecha: 20 de Abril de 2015

  • 1. Considere el siguiente algoritmo donde la entrada es una matriz de n x (n + 1) de nmeros reales.

    for i = 0 to n-1 do for j = i + 1 to n- 1 do for k = i to n do A[j, k]

  • public class matriz { public static void main(String[] args) { int matriz[][] = new int[3][4]; // Creamos una matriz de 3x4 como ejemplo int i, j, k, n = 3; // Inicializamos los valores de la matriz matriz[0][0] = 2; matriz[0][1] = 4; matriz[0][2] = 4; matriz[0][3] = 7; matriz[1][0] = 6; matriz[1][1] = 6; matriz[1][2] = 9; matriz[1][3] = 13; matriz[2][0] = 8; matriz[2][1] = 10; matriz[2][2] = 12; matriz[2][3] = 33; // Recorremos la matriz para verificar su configuracin inicial for (int x = 0; x < matriz.length; x++) { for (int y = 0; y < matriz[x].length; y++) { System.out.print(matriz[x][y]); } System.out.println(); } //proceso sealado en la tarea for (i = 0; i

  • Derive la complejidad del algoritmo.

    Desarrollando cada for y la cantidad de veces en que se realiza cada uno podemos llegar a

    la siguiente sumatoria:

    S = 4*n(n-i+1)(n-i)

    Extendiendo esta sumatoria se tiene:

    i=0 -> 4n3 + 4n2

    i=1-> 4n3 - 4n2

    i=2-> 4n3 -12n2 +8n . . . i=n-1-> 8n

    Por lo cual el trmino dominante es n3 y por lo tanto nuestra sumatoria S esta acotada de la

    siguiente forma:

    S cn3 con c R, n0 n

    Lo que nos indica que en notacin Big-O la complejidad de este algoritmo es O(n3).

  • Existe alguna mejora posible al algoritmo?

    Para mejorar el algoritmo cambiamos la funcin Enigma por el siguiente cdigo:

    for (i = 1; i 2n-2 i=3-> 3n-3 . . . i=n-1-> n2 -2n + 1

    Por lo cual el trmino dominante es n2 y por lo tanto nuestra sumatoria S esta acotada de la

    siguiente forma:

    S cn2 con c R, n0 n

    Lo que nos indica que en notacin Big-O la complejidad de este algoritmo es O(n2). Siendo

    mejor que el anterior algoritmo que tenia complejidad O(n3).

  • A continuacin se muestra el cdigo para que pueda ser probado y comprobar que realiza lo

    mismo que el cdigo original.

    public class matriz {

    public static void main(String[] args) {

    int matriz[][] = new int[3][4]; // Creamos una matriz de 3x4 como ejemplo

    int i, j, k, n = 3;

    // Inicializamos los valores de la matriz

    matriz[0][0] = 2;

    matriz[0][1] = 4;

    matriz[0][2] = 4;

    matriz[0][3] = 7;

    matriz[1][0] = 6;

    matriz[1][1] = 6;

    matriz[1][2] = 9;

    matriz[1][3] = 13;

    matriz[2][0] = 8;

    matriz[2][1] = 10;

    matriz[2][2] = 12;

    matriz[2][3] = 33;

    // Recorremos la matriz para verificar su configuracin inicial

    for (int x = 0; x < matriz.length; x++) {

    for (int y = 0; y < matriz[x].length; y++) {

    System.out.print(matriz[x][y]);

    }

    System.out.println();

    }

    //proceso mejorado

    for (i = 1; i

  • 2. Quickselect es el siguiente algoritmo simple para encontrar el k-esimo elemento ms pequeo en un conjunto desordenado S.

    QuickSelect(S; k) Tome un elemento pivote p aleatoriamento de S Comparando p a cada uno de los elementos de S, divide S en dos partes: S1 = {x S : x < p} and S2 = {x S : x > p} if jS1j = k - 1 then return p if jS1j > k - 1 then return QuickSelect(S1; k) if jS1j < k - 1 then return QuickSelect(S2; k -|S1|- 1)

    Determine el nmero esperado de comparaciones hechas por el QuickSelect en el

    conjunto S de tamao n. Puede asumir que inicialmente k = n/2, el cual es el peor caso.

    Primero que todo, por simplicidad suponemos que los nmeros del conjunto S no se repiten

    y adems k |S| para conservar la correctitud del algoritmo de bsqueda.

    Definimos nuestra variable aleatoria.

    - X: nmero de iteraciones que realiza el algoritmo. En donde xi seala la i-sima iteracin.

    Por lo tanto nuestra ecuacin para determinar la esperanza queda de la siquiente forma:

    E[X] = E[ xi] = =

  • Expandiendo la sumatoria descrita anteriormente tenemos:

    =

    .

    .

    .

    En donde el Si es el conjunto no seleccionado en la i-sima iteracin.

    Al hacer los supuestos expuestos anteriormente y expandir la sumatoria nos damos cuenta

    que es un caso muy complejo de analizar, por lo cual realizamos este intento por simplificar

    el estudio del caso de las comparaciones y llegamos a buscar en internet si alguien ms

    haba solucionado esta incgnita y nos encontramos con el estudio del matemtico y

    experto en ciencias de la computacin Donald Knuth (1971) que demostr que Ck

    n ,el

    nmero medio de comparaciones necesarias para seleccionar el k-simo de entre n es:

    Ckn = 2((n + 1)Hn - (n + 3 - j)Hn+1-k - (j + 2)Hk + n + 3)

    El valor mximo se alcanza para k = n/2; entonces:

    Ckn = 2(ln 2 + 1)n + O(n).

    Lo que nos indica que el valor esperado de comparaciones para el k-simo elemento es

    O(n)

    Probabilidad de encontrar

    el k-simo elemento en la

    iteracin n

    Probabilidad de no haber

    encontrado el elemento

    anteriormente