Universidade Federal do ABC Disciplina: BC1424 - Algoritmos e Estruturas de Dados I Professor: Jesús P. Mena-Chalco Avaliação: Prova 02 Turma: Noturno Data: 03/05/2016 Nome completo: RA: Instruções para a prova (leia antes de começar): 1) A prova tem a duração de 1h50min. 2) Utilize a linguagem C para todas as questões (não utilize pseudocódigo). 1. Selection Sort é um algoritmo de ordenação baseado em se passar sempre o menor valor do vetor para a primeira posição (ou o maior dependendo da ordem requerida), depois o de segundo menor valor para a segunda posição, e assim é feito sucessivamente com os (n-1) elementos restantes, até os últimos dois elementos. void SelectionSort ( int v[], int n ) { int i, j, iMin, aux; for (i=0; i<n­1; i=i+1) { iMin = i; for (j=i+1; j<n; j=j+1) { if (v[iMin]>v[j]) iMin = j; } if (iMin!=i) { aux = v[iMin]; v[iMin] = v[i]; v[i] = aux; } } } Implemente o Selection Sort usando uma função recursiva que receba um vetor e o seu tamanho, porém inverta a ideia, ao invés de passar o menor valor para a primeira posição, depois o segundo maior para a segunda posição e assim por diante; pense de forma a passar o maior valor para a última posição, depois o segundo maior para a penúltima posição e assim sucessivamente para os (n-1) elementos. Assinatura: void selectonSortRec( int v[], int n ) 2. O algoritmo de ordenação Merge Sort é estável se a função de Intercala for estável. (a) A função a seguir é estável? Se sim, justifique sua afirmação. Se não, apresente a modificação para torná-la estável. Justifique sua resposta. (b) Qual é o número de comparações da linha 4 no melhor e no pior caso? 1. void Intercala ( int p, int q, int r, int v[] ) { 2. int i=p, j=q, k, w[r­p]; 3. for (k=0; i<q && j<r; k=k+1) { 4. if (v[i]<v[j]) { 5. w[k] = v[i]; 6. i = i+1; 7. } 8. else { 9. w[k] = v[j]; 10. j = j+1; 11. } 12. } 13. while (i<q) { 14. w[k] = v[i]; 15. k = k+1; 16. i = i+1; 17. } 18. while (j<r) { 19. w[k] = v[j]; 20. k = k+1; 21. j = j+1; 22. } 23. for(i=p; i<r; i=i+1) 24. v[i] = w[i­p]; 25.} (a) A ordenação será estável se o método de Intercala for estável. A implementação do algoritmo Mergesort (como apresentada na prova) é não-estável pois não mantem a ordem cronológica dos elementos iguais. O algoritmo seria estável se, na linha 5, no lugar de: if(v[i]<v[j]) seja considerado: if(v[i]<=v[j]) (b) A abordagem considerada no Mergesort é dividir-para-conquistar. O vetor é divido em 2 partes (a primeira parte tem comprimento floor((r-p)/2), a segunda parte tem comprimento ceil((r-p)/2), para p<r) até chegar no nível unitário. Após isso, as partes são intercaladas na forma crescente (conquista). Número de comparações: - No melhor caso: (r-p)/2, quando q=(p+r)/2 (i.e., quando a partição for equilibrada) - No pior caso: r-p, quando p=q ou r=q (i.e., quando a partição não for equilibrada) Lembrando que no Mergesort o valor de q é igual a (p+r)/2. 3. Considere o algoritmo de ordenação Quick Sort: (a) Qual é a altura que a pilha de recursão pode atingir? Indique em termos de p e r. (b) Apresente uma variante do Quick Sort de tal forma que a pilha de recursão tenha altura proporcional a O(log(n)), onde n é o número de elementos no vetor. Justifique sua resposta. void QuickSort(int A[], int p, int r) { if (p<r) { int q = Particione(A, p, r); QuickSort(A, p, q­1); QuickSort(A, q+1, r); } } (a) Quando a particição do vetor dado como entrada for não equilibrada (i.e., quando p-q=1 ou r-q=1) a altura da pilha pode atingir a altura proporcional ao número de elementos do vetor, isto é: r-p. (b) A seguinte solução garante que o tamanho da pilha da recursão seja O(log(n)), pois sempre é resolvida a menor metade das 2 após a partição. Se for utilizada essa abordagem a pilha pode chegar a uma altura de r-p no pior caso. 4. Quais posições de um vetor organizado como um Max-Heap de (2^n)-1 elementos distintos poderiam ser ocupadas pelo terceiro maior elemento? E o terceiro menor elemento?. Suponha que n>3. Justifique. Terceiro maior elemento: Posições [2 .. 7] Terceiro menor elemento: Posições [2^(n-2) .. (2^n)-1] 5. Use a função HeapSort para ordenar o vetor [16, 15, 14, 13, 12, 11, 10]. Apresente a estrutura do Max-Heap constituído a cada iteração do algoritmo. Construção do Max­Heap: vetor = [16, 15, 14, 13, 12, 11, 10] // O vetor já é um max­heap Iteração 1: vetor = [15, 13, 14, 10, 12, 11, 16] Iteração 2: vetor = [14, 13, 11, 10, 12, 15, 16] Iteração 3: vetor = [13, 12, 11, 10, 14, 15, 16] Iteração 4: vetor = [12, 10, 11, 13, 14, 15, 16] Iteração 5: vetor = [11, 10, 12, 13, 14, 15, 16] Iteração 6: vetor = [10, 11, 12, 13, 14, 15, 16] Iteração 7: vetor = [10, 11, 12, 13, 14, 15, 16] 6. Descreva brevemente o algoritmo de ordenação hibrido visto em laboratório QuickInsertionSort. (a) Qual a vantagem de usar primeiro o Quick Sort e depois o Insertion Sort? (b) Qual a complexidade do algoritmo híbrido no pior caso? O tempo de execução do QuickSort pode ser melhorado na prática considerando a vantagem do tempo de execução do insertionSort quando a entrada está quase ordenada. Abordagem: - Utilize o QuickSort (versão que escolhe o pivô de forma aletória) para tamanhos de vetor maiores do que K. Se o tamanho for menor ou igual a K, devolva o vetor sem ordenar. - Utilize o InsertionSort para ordenar o vetor inteiro. (a) O quickSort deixará o vetor, dado como entrada, quase ordenado (sabemos que o algoritmo quickSort é eficiente pois utiliza um elemento pivô selecionado de forma aleatória. O insertionSort é muito eficiente para vetores de comprimento pequeno. (b) O tempo de execução total será: O( nk + n log(n/k) ) 7. Mostre a árvore final após inserir as chaves a seguir em uma árvore binária de busca, inicialmente vazia: F, S, K, C, L, H, T, W, M, P, A, X, D, B. (4 pontos) Considere a ordem do alfabeto: A B C D E F G H I J K L M N O P Q R S T U V W X Y Z URL interativo: https://www.cs.usfca.edu/~galles/visualization/BST.html 8. O percurso de uma árvore binária de busca em ordem r-e-d resultou na impressão da sequência M, B, A, E, C, D, R, P, N, O, W, e o percurso da mesma árvore em ordem e-r-d resultou em A, B, C, D, E, M, N, O, P, R, W. Construa uma árvore que satisfaça esses percursos. (5 pontos) 9. Dadas a estrutura de uma árvore binária de busca, escreva uma função recursiva que receba a raiz de uma árvore binária de busca e imprima os valores de suas chaves em ordem decrescente. struct cel { int conteudo; struct cel *pai; struct cel *esq; struct cel *dir; }; typedef struct cel no; Assinatura: void imprimir( no * r ) A varredura e-r-d em uma ABB percorre os elementos na ordem crescente. A varredura d-r-e permitirá percorrer os elementos na ordem decrescente! 10. Faça uma “boa pergunta” de um tópico que domine e esteja relacionada com a disciplina. Apresente uma resposta detalhada que prove seus conhecimentos sólidos na disciplina. Demonstre seu dominio na disciplina.