Universidade do Estado Rio de Janeiro Análise de Algoritmos Prova 2 (2010/2) NOME: ____________GABARITO____________________________________ NOTA: _________ RUBRICA DO PROFESSOR: ______________ 1a QUESTÃO (VALOR 3,0 PONTOS) Calcule a árvore binária de busca ótima para as entradas dadas a seguir: j fj f´j 0 1 1 3 9 2 2 1 3 12 7 RESPOSTA: F[i,j] 1+3+9=13 9+2+1=12 1+12+7=20 d=1 c[i,j] 13+0+0=13 12+0+0=12 20+0+0=20 i 0 1 2 j 1 2 3 i 0 j 2 F[i,j] 13+2+1=16 d=2 c[i,j] 16+12+0=28 1 3 12+12+7=31 31+12+0=43 i j F[i,j] d=3 c[i,j] 0 3 16+12+7=35 35+28+0=63 1 13 16 35 9 12 31 F= 1 20 c = 7 c[i,k-1] 0 0 0 s1 s2 k 1 2 3 c[i,k-1] 0 13 0 12 c[k,j] 12 0 20 0 k 1* 2 2 3* c[i,k-1] 0 13 28 c[k,j] 43 20 0 k 1 2 3* 0 13 28 63 0 12 43 0 20 0 s3 c[k,j] 0 0 0 K= 1 1 3 2 3 3 2a QUESTÃO (VALOR 2,0 PONTOS) Dizer se as afirmativas abaixo são verdadeiras ou falsas, justificando as falsas. 1. O custo total de uma árvore binária de busca de partilha ótima é sempre menor do que o custo de uma árvore binária de busca de ótima. RESPOSTA: Não necessariamente, pois depende das frequências de acesso às chaves nas árvores, em particular, se as frequências forem iguais para todas as chaves, teremos as duas árvores com o custo igual. Logo, a afirmação é FALSA! 2. Para se escolher a chave de partilha de uma determinada raiz de uma sub-árvore, é necessário analisar vários subproblemas possíveis de tal forma a encontrar o de menor custo. RESPOSTA: VERDADEIRA. 3a QUESTÃO (VALOR 2,0 PONTOS) Para a árvore binária de busca de partilha abaixo, calcule os valores de x, y e z dos alcances. Justifique os cálculos. [1,1] [z,4] [x,y] RESPOSTA: O alcance da raiz é [1,5], pois existem 5 nós na árvore. Sendo assim, de acordo com o alcance dado do filho esquerdo da raiz, conclui-se que a chave de partilha da raiz é 1 e, logo, o alcance do filho direito da raiz será [2,5]. A partir daí, infere-se que o valor de z = 2 e a chave de partilha de seu pai será 4 o que nos leva finalmente, ao valor de x = 5 e ao valor de y = 5. 4a QUESTÃO (VALOR 2,0 PONTOS) Seja uma árvore binária apontada por ptraiz cujos nós possuem como informação um número inteiro. Faça um algoritmo para criar uma lista do tipo pilha com os nós de valores inteiros ímpares e outra pilha com os valores inteiros pares. Não deve ser alocada região de memória para criar as pilhas, pois as mesmas deverão ser implementadas com ponteiros para seus topos pLpar e pLimpar, além de um campo prox dos nós da pilha, conforme pode ser visto pelo esquema abaixo. esq RESPOSTA: função par-ou-ímpar (pt) dir info prox INÍCIO se pt^.esq nil então par-ou-ímpar (pt^.esq); fimse; se pt^.dir nil então par-ou-ímpar (pt^.dir); fimse; se resto (pt^.info/2) = 0 então pt^.prox := pLpar; senão pt^.prox := pLimpar; fimse; FIM Par-ou-ímpar; pLpar := pt; pLimpar := pt; função principal INÍCIO pLpar := nil; pLimpar := nil; se ptraiz nil então par-ou-ímpar (ptraiz); fimse; FIM. 5a QUESTÃO (VALOR 1,0 PONTO) Qual é a complexidade do algoritmo da questão anterior? E qual seria essa mesma complexidade se tivéssemos listas de números pares e ímpares ordenadas ao invés de pilhas? RESPOSTA: Supondo que a árvore do problema anterior tenha n nós, uma vez que é necessário visitar todos os nós para inserilos em uma das duas pilhas (pLpar ou pLimpar) e, levando-se em conta que a inserção nas pilhas tem complexidade O(1), conclui-se que a complexidade do algoritmo da questão anterior é O(n), ou seja, apenas o custo de se visitar todos os nós da árvore. Na questão anterior, se tivéssemos listas ordenadas ao invés de pilhas, haveria um custo adicional para se adicionar um nó na posição correta da sua lista (na ordem correta) para cada nó visitado. Como não existe a possibilidade de se acessar um elemento da lista de forma aleatória, é necessário percorrer todos os seus elementos desde o início (a partir de pLpar ou pLimpar) para se localizar a posição correta do nó inserido, então, no pior caso, teremos que percorrer toda a lista que, por sua vez, no pior caso, conterá todos os elementos da árvore, visto que os nós podem ter dados somente de um tipo (par ou ímpar). Sendo assim, a complexidade nesse caso seria O(n2).