You are on page 1of 4

UNIVERSIDAD TECNICA FEDERICO SANTA MARIA DEPARTAMENTO DE ELECTRONICA ELO320 Estructuras de Datos y Algoritmos

20/11/2008 Segundo Certamen Pregunta 1: Dado el siguiente cdigo y un arreglo de nmeros ordenados a[ ]:
int s(int a[ ], int v, int l, int r) { while (r >= 1) { int m = (l + r)/2; if (v == a[m]) return m; if (v < a[m]) r = m - 1; else l = m + 1; // T(n) = de 0 a log2n // T(n) = 3 = O(1) // // // // T(n) T(n) T(n) T(n) = = = = 2 1 2 2 = = = = O(1) O(1) O(1) O(1)

// T(n) = 2 = O(1) // Adentro while: // T(n) = 3 + 6 = O(1)

} return 1; }

a) Determine T(n)

20 puntos

Hay dos tipos de soluciones: 1- Dado que costo de dividir el input (n) en dos en cada iteracin es c El resultado es: T(n) = T(n/2) + c 2- Sumar costo de instrucciones por operaciones adentro while Obtener sumatoria correcta del while Resolver y obtener T(n) anterior correcto Bono: Determinar que n = r l 15 puntos

10 puntos 5 puntos 5 puntos 10 puntos 2 puntos

b) Determine (n)

Justificacin: 5 puntos Para el T(n) obtenido existen c1 y c2 que la acotan por encima y por debajo: c1 f(n) <=T(n) <= c2 f(n) con n >= n0 Resultado: (n) = (log n) 10 puntos

Nota: si se calcula a) erroneamente el maximo en b) son 10 puntos.

24-11-2008

UNIVERSIDAD TECNICA FEDERICO SANTA MARIA DEPARTAMENTO DE ELECTRONICA ELO320 Estructuras de Datos y Algoritmos

Pregunta 2: Se necesita almacenar un registro vehicular usando una funcin de hash. Las patentes tienen dos formatos posibles AA1111 ZZ9999 o AAAA11 ZZZZ99. a) Escriba una funcin que genere un hash con strings de input en el formato descrito, puede usar el valor ASCII de A Z (A = decimal 65) en su calculo: int h(char *str, int B); 20 puntos Se presentan dos soluciones una, h que no considera la posicin del carcter a usar y otra h2 que si la considera. h2 es preferible pero se aceptan ambas soluciones. int h(char *str, int B) { int i; int result=0; for (i=0; *(str+i);i++){ result+=*(str+i); } return result%B; } int h2(char *str, int B) { int i; int result=0; for (i=0; *(str+i);i++) { result+=*(str+(i*10)); } return result%B; } b) Genere un programa completo que utilice la funcin h( ) con los strings de input: "AB1234 y CCCC23. Imprima el resultado de h( ) utilizando printf. 15 puntos #define B 999 typedef struct moldecelda { char patente[7]; } celda; celda Arr[B]; // definir B, estructura y tabla hash 5 puntos // recorrer string 5 puntos // sumar valores string 5 puntos // modulo 10 puntos

24-11-2008

UNIVERSIDAD TECNICA FEDERICO SANTA MARIA DEPARTAMENTO DE ELECTRONICA ELO320 Estructuras de Datos y Algoritmos

main(int argc, char *argv[]) { char *str1="AB1234"; char *str2="CCCC23"; char *str3="23CCCC"; strcpy(Arr[h(str1, B)].patente, str1); strcpy(Arr[h(str2, B)].patente, str2); strcpy(Arr[h(str3, B)].patente, str3); printf("h(%s)=%d\n" ,str1, h(str1,B) ); printf("h(%s)=%d\n" ,str2, h(str2,B) ); printf("h(%s)=%d\n" ,str3, h(str3,B) ); printf("h2(%s)=%d\n" ,str2, h2(str2,B) ); printf("h2(%s)=%d\n" ,str3, h2(str3,B) ); } Output: h(AB1234)=333 h(CCCC23)=369 h(23CCCC)=369 h2(CCCC23)=343 h2(23CCCC)=376 // invocar funcion 5 puntos

// usar printf correctamente 5 puntos

<- no pondera las posiciones de los caracteres

<- si pondera las posiciones de los caracteres

Pregunta 3: Considerando la estructura: typedef struct moldenodo { int clave; struct moldenodo *left; struct moldenodo *right; } nodo, *pnodo; a) Escriba una funcin que cuente los nodos internos con valores de la clave entre dos nmeros dados (inclusive) y retorne ese valor: 30 puntos int contarInternos(pnodo *pRaiz, int n1, int n2);

24-11-2008

UNIVERSIDAD TECNICA FEDERICO SANTA MARIA DEPARTAMENTO DE ELECTRONICA ELO320 Estructuras de Datos y Algoritmos

int contarInter(pnodo t, int n1, int n2) { int count_flag=1; if (!t) return 0; if ((!t->left) && (!t->right)) return 0; // no contar hojas 5 puntos

if ((t->clave < n1) || (t->clave > n2)) // contar nodos en rango 5 puntos count_flag = 0; // visitar arbol completo correctamente 15 puntos return (count_flag + contarInter(t->left, n1, n2) + contarInter(t->right, n1, n2)); } int contarInternos(pnodo t, int n1, int n2) { int total=0; total += contarInter(t->left, n1, n2); total += contarInter(t->right, n1, n2); return (total); } Ejemplo de uso: pRoot = Insertar(pRoot, 3); pNuevo = Insertar(pRoot, 1); pNuevo = Insertar(pRoot, 5); pNuevo = Insertar(pRoot, 4); pNuevo = Insertar(pRoot, 6); printf("Total numero de nodos internos entre %d y %d:%d \n", min, max, contarInternos(pRoot, min, max)); printf("Total numero de nodos internos entre %d y %d:%d \n", min, max, contarInternos(pRoot, min, max)); $ tree.exe Total numero de nodos:5 Total numero de nodos internos entre 0 y 6:1 Total numero de nodos internos entre 0 y 4:0 // no contar raiz 5 puntos

24-11-2008