Gabarito

Propaganda
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.
Download