Introdução aos Algoritmos e Estruturas de Dados 2 o Teste - A Ano lectivo: 2010/2011 2 o Semestre RESOLUÇÃO DO 2 o TESTE Grupo I (2.0 + 2.5 + 2.0 = 6.5 val.) I.a) Considere os tipos enum ocasiao e Presente definidos da seguinte forma: enum ocasiao Aniversario, Natal, DiaEspecial ; typedef struct Presente* Presente; struct Presente int id; int valor; enum ocasiao oc; char* para; ; Escreva, em linguagem C, a função lepresente, declaradaabaixo,quelêdostandard input a informação dos presentes e devolve um vector. Assuma que o nome de cada pessoa a guardar no campo para não ultrapassa 30 caractares alfanuméricos. A função recebe um argumento, que indica onúmerodepresentesacriar. Cadapresentevemdescritonuma linha que contém, separados por espaços: o valor do presente, um inteiro; o tipo de ocasião, queéumcharacter:a, N ou D; onomedo destinatário, que não poderá conter espaços. Cada presente deverá ter um número de identificação ú n i c o. Presente lepresente(int n) Solução: Presente vector; char nome[31]; char ocasiao; vector = (Presente) calloc(n, sizeof(struct Presente));
while(n > 0) n--; vector[n].id = n; scanf("%d %s %s", &(vector[n].valor), &ocasiao, nome); vector[n].para = (char*) calloc(strlen(nome)+1, sizeof(char)); strcpy(vector[n].para, nome); vector[n].oc = Aniversario; switch(ocasiao) case N : vector[n].oc = Natal; break; case D : vector[n].oc = DiaEspecial; break; return vector; 2/13
I.b) Considere a seguinte definição de uma lista duplamente ligada circular: typedef struct CircularDLL* CircularDLL; struct CircularDLL CircularDLL next; CircularDLL prev; Item val; ; Note que numa lista circular o último elemento está ligado ao primeiro. Escreva em C a seguinte função: CircularDLL insert(circulardll list, int i, Item obj) A função deve receber: uma lista duplamente ligada circular; um inteiro i >= 0 que indica a posição ainserir;umainstânciadotipoitem. ApósinseriroItem afunçãodevolvealistacircularquecomeça por esse elemento. Note que a posição 0 significa inserir na cabeça de lista e a posição 1 aseguir ao primeiro elemento, usando o ponteiro next. Observe também que como a lista é circular são permitidas posições maiores que o comprimento da lista. Solução: CircularDLL res; res = (CircularDLL) calloc(1, sizeof(struct CircularDLL)); res->val = obj; res->prev = res; /* Empty case sentinel */ if(list!= NULL) while(i > 0) list = list->next; i--; res->next = list; res->prev = list->prev; res->prev->next = res; /* Finish Empty case */ res->next->prev = res; return res; 3/13
I.c) Considere uma árvore binária de pesquisa equilibrada, com n níveis, contendo todos os números inteiros no intervalo [1, 2 n 1]. No exemplo representado abaixo, temos n =4eportantoaárvore contém todos os números inteiros no intervalo [1, 15]. Implemente um programa em linguagem C que, para um determinado valor de n, lidodostdin, imprimanostdout uma sequência de valores do intervalo [1, 2 n 1] ordenada por forma a que se obtenha uma árvore equilibrada imediatamente após a inserção. Por exemplo, uma sequência possível para criação da árvore abaixo seria: 8, 4, 2, 1, 3, 6, 5, 7, 12, 10, 9, 11, 14, 13, 15. 8 4 12 2 6 10 14 1 3 5 7 9 11 13 15 Sugestão: Implemente uma função recursiva que receba como argumentos os valores mínimo e máximo existentes numa dada sub-árvore, e que imprima o valor da raiz da referida sub-árvore, invocando-se a ela própria de seguida para as sub-árvores do lado esquerdo e direito. Note que uma sub-árvore deste tipo, com valor mínimo x evalormáximoy, temraizcomvalor(x + y)/2. Por exemplo, a árvore acima, com valor mínimo 1 e valor máximo 15, tem raiz com valor 8. O mesmo se verificando para todas a sub-árvores. Solução: #include <stdio.h> void recurs(int x, int y) int r = (x+y)/2; printf("%d\n", r); if(x < y) recurs(x, r-1); recurs(r+1, y); int main() int n, m; scanf("%d", &n); for(m = 1; n > 0; m *= 2, n--); recurs(1, m-1); return 0; 4/13
Grupo II (1.5 + 1.5 + 1.5 + 1.5 = 6.0 val.) II.a) Considere a seguinte implementação, nova, da função de partição do algoritmo de ordenação quicksort: typedef int Item; #define key(a) (A) #define less(a, B) (key(a) < key(b)) #define exch(a, B) Item t = A; A = B; B = t; int partition(item a[], int l, int r) int sl; sl = l; while(l < r) if(less(a[l], a[r])) exch(a[l], a[sl]); sl++; l++; exch(a[sl], a[r]); return sl; Após executar os seguintes comandos: Item a[] = 19, 6, 1, 20, 48, 15, 25, 2, 25, 7 ; partition(a, 0, 9); partition(a, 5, 9); Qual é o estado do vector a[]? a. 7, 6, 1, 2, 19, 15, 20, 25, 25, 48, b. 6, 1, 2, 7, 48, 15, 19, 20, 25, 25, c. 7, 6, 1, 2, 19, 20, 15, 25, 25, 48, d. 7, 6, 1, 2, 19, 20, 25, 15, 25, 48, e. 2, 6, 1, 7, 48, 15, 19, 20, 25, 25, f. 6, 1, 2, 7, 48, 19, 15, 20, 25, 25, Solução: Arespostacertaé(b). 5/13
II.b) Considere a seguinte sequência de números inteiros sem sinal, que se encontram representados por palavras de 10 bits: 11, 12, 3, 10, 16, 21, 32, 22, 5, 1 Qual será o quarto elemento da sequência, após dois passos doalgoritmodeordenaçãoradixlsd, considerando que em cada passo é analisado 1 bit? a. 5 b. 11 c. 16 d. 21 e. 22 f. 32 Solução: Arespostacertaé(d). 6/13
II.c) Considere a representação, conceptual, de árvore binária em vector utilizada pela estrutura de dados amontoado. Usando essa representação, qual dos seguintes vectores representa uma árvore binária de pesquisa? a. 5, 8, 12, 1, 6, 11, 13, 2, 3 b. 8, 1, 12, 5, 6, 13, 11, 2, 3 c. 8, 5, 12, 6, 5, 13, 11, 1, 3 d. 8, 5, 12, 2, 6, 11, 13, 1, 3 e. 12, 5, 8, 2, 6, 13, 11, 1, 3 f. 8, 5, 12, 1, 6, 11, 13, 2, 3 Solução: Arespostacertaé(d). 7/13
II.d) Considere que se pretende ordenar o vector abaixo, utilizando o algoritmo de ordenação heapsort. O heapsort começa por transformar o vector a ordenar num amontoado (heap). Após esta fase, qual será o conteúdo do vector? 11, 12, 3, 10, 16, 21, 32, 22, 5, 1 a. 11, 12, 3, 10, 16, 21, 32, 22, 5, 1 b. 32, 22, 11, 12, 16, 21, 3, 10, 5, 1 c. 32, 22, 21, 12, 16, 11, 3, 10, 5, 1 d. 32, 21, 22, 3, 11, 16, 12, 1, 5, 10 e. 32, 21, 22, 12, 16, 11, 3, 10, 5, 1 f. 1, 3, 5, 10, 11, 12, 16, 21, 22, 32 Solução: Arespostacertaé(c). 8/13
Grupo III (1.5 + 1.5 = 3.0 val.) III.a) Qual a posição em que é colocado o último valor da sequência: 32, 20, 90, 10, 12, 53, 42, 9 quando estes são introduzidos numa tabela de dispersão de dimensão 13, com resolução por procura linear (linear probing), inicialmente vazia, sabendo que a função de hash é a dada abaixo? a. primeira b. segunda c. quarta d. quinta e. décima f. décima primeira hash(k) =(k +1)mod 11 Solução: Arespostacertaé(d). 9/13
III.b) Considere uma árvore binária de pesquisa, que contém os nú m e r o s i n t e i r o s d e 1 a 2 7 ( i n c l u - sivé), inseridos por ordem decrescente. Sabendo que o procedimento balancer, apresentadoabaixo, foi utilizado para equilibrar a referida árvore, indique quantas vezes foi invocada a função partr apartirdebalancer?notequeafunçãopartr(h,k) coloca na raíz o (k+1)-ésimo elemento da á r v o r e c o m r a í z e h. m link balancer(link h) if (h->n < 2) return h; h = partr(h, h->n/2); h->l = balancer(h->l); h->r = balancer(h->r); return h; a. 1 b. 13 c. 14 d. 15 e. 18 f. 27 Solução: Arespostacertaé(d). 10/13
Grupo IV (1.5 + 1.5 + 1.5 = 4.5 val.) IV.a) Considere o grafo dirigido e acíclico representado abaixo. Quantas ordenações topológicas existem para os vértices do grafo? a. 1 b. 2 c. 3 d. 4 e. 5 f. 6 Solução: Arespostacertaé(c). 11/13
IV.b) Qual a sequência de vértices visitados numa travessia em profundidade primeiro (DFS), do grafo abaixo, com origem no vértice F? Considere que os vértices são visitados por ordem alfabética equeosvérticesadjacentesdeumdadovérticetambémsãovisitadosporordemalfabética. A C B F D E G a. F, C, B, A, D, E, G b. F, E, G, D, A, B, C c. F, E, G, D, C, B, A d. F, C, B, A, D, G, E e. F, C, A, B, D, G, E f. F, C, A, B, D, E, G Solução: Arespostacertaé(a). 12/13
IV.c) Qual o caminho obtido pelo algoritmo de Dijkstra entre os nós FeGdografoabaixo? A C 7 4 9 B 8 3 D 6 E 11 G 15 1 13 F a. F, E, G b. F, C, B, A, G c. F, C, E, G d. F, C, B, E, G e. F, C, B, E, D, G f. F, E, D, G Solução: Arespostacertaé(d). 13/13