You are on page 1of 16

Universidad Nacional del Altiplano

Tema:
1. ARRAYS - ANLISIS

Ing. Mg. Oliver Amadeo Vilca Huayta

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)

Arreglos: inicializacin y acceso


int billy [5]; int billy [5] = { 16, 2, 77, 40, 12071 }; Billy[2] = 75; Complete con sus valores:

Hallar un nmero en un arreglo A[1..n]


Considere el problema de encontrar un nmero en un arreglo A[i..f]. int Busca( int A[] ,int n, int clave) { int k = 0; while ( k <= n ) { if ( clave == A[k] ) // Verifica si es return 1; // Bingo! Encontrado k++; } return 0; // No encontrado } // Nota: busca desde el ndice '0' hasta 'n'.

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.

Hallar el mximo de un arreglo A[1..n]


Considere el problema de encontrar el mximo de un arreglo de nmeros A[1..n]. Entrada: Un arreglo de nmeros A[1..n] no se conoce la permutacin de nmeros.

Hallar el mximo de un arreglo A[1..n]


Considere el problema de encontrar el mximo de un arreglo de nmeros A[1..n]. Solucin: imagine un proceso en que los datos se van examinando uno a uno, comparndolos con el mximo encontrado hasta el momento.

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)

Gracias por su atencin

You might also like