Professional Documents
Culture Documents
Tema:
1. ARRAYS - ANLISIS
Arreglo
En computacin y en particular un lenguaje de programacin como el C,C++ o Java, un arreglo (o array) es un tipo especial de variable (o estructura de dato) el cual puede almacenar mas de un valor al mismo tiempo bajo el mismo nombre (de variable), a los cuales se puede acceder haciendo referencia a un ndice. Generalmente los elementos son del mismo tipo, ubicados en posiciones de memoria contiguas. Ejemplo: int B[7]; // Define un arreglo de enteros (7celdas) B[0] = 90; // Asigna valor a la celda 0 B[1] = 37; // Asigna valor a la celda 1 int C[77]; // Un arreglo de puntos flotantes (77c's)
Tipos de anlisis
Peor Caso: El elemento buscado se encuentra en la ltima posicin verificada. T(n) = n Mejor Caso: El nmero buscado se encuentra en la primera posicin inspeccionada. T(n) = 1 Caso medio: De que depende el tiempo esperado? Conocemos la distribucin de datos? Qu podemos hacer para calcular el tiempo esperado? Supuesto: Distribucin uniforme de datos.
En la variable 'm' guardamos el mximo del arreglo buscado, si encontramos un nuevo mximo, lo actualizamos
int maximo( int A[] , int n) { k = 0; max = A[0]; // Primer candidato a mximo while ( k < n ) { ++k; if ( A[k] > max ) // Verifica si es mayor max = A[k]; // Nuevo mximo } return max; } // Nota: busca desde el ndice '0' hasta 'n'.
Tipo de ejecucin:
Sin importar al distribucin estadstica de los datos siempre debe recorrer todo el arreglo para encontrar el mximo. T(n) = n En todos los casos.
Calcular X
Lo primero que se nos puede ocurrir es multiplicar el nmero x, n veces: y = 1; z = x; for ( j=n; j>0; --j ) // j va de n hasta 1 y = y*z; Mejora: si j es par, podemos elevar z al cuadrado si al mismo tiempo se divide j por 2. As, j disminuye mucho ms rpido.
Calcular X
Se puede haces siempre que j sea par: y = 1; z = x; for ( j=n; j>0; --j ) // j disminuye en 1 { while ( j es par ) { z = z*z; j = j/2; // j se divide en 2 } y = y*z; }
Calcular X
y = 1; z = x; for ( j=n; j>0; --j ) // j disminuye en 1 { while ( j % 2 == 0 ) // Cuanto cuesta? { z = z*z; j = j/2; // j se divide en 2 } y = y*z; }
Calcular X
y = 1; z = x; for ( j=n; j>0; --j ) // j disminuye en 1 { while ( j & 1 == 0 ) // Tiempo constante { z = z*z; j = j/2; // j se divide en 2 } y = y*z; }
Versin refinada.
Calcular X
versin refinada.
for ( j=n; j>0; --j ) { while ( j & 1 == 0 ) { z = z*z; j = j/2; } y = y*z; } T(n) = O(log n), j slo se puede dividir log(n) veces por 2 antes de llegar a 1. Si bien j slo se divide cuando es par, pero si es impar en una iteracin del for, est garantizado que ser par en la siguiente iteracin.
Ejercicios:
Cmo se puede implementar la divisin por dos? Hint: Desplazamiento de bits (shift)