Anda di halaman 1dari 4

Programao II- OL 2010/2011 Resoluo do 1 Exame (6-6-2011) Grupo 1 [6 valores] 1.

Considere a seguinte rvore binria


80

70

60

55

46

30

20

21

a) uma rvore binria de pesquisa? Justifique. No, porque 60 (valor da raz da rvore direita) menor que 80 (valor da raz). Uma rvore binria de pesquisa uma rvore binria e ordenada pelo seguinte critrio: (i) o contedo de qualquer n da subrvore esquerda menor ou igual que o contedo do n pai, (ii) o contedo de qualquer n da subrvore direita maior que o contedo do n pai e (iii) ambas as subrvores so rvores binrias de pesquisa. b) um amontoado (heap)? Justifique. No, porque a rvore no completa. Um amontoado uma rvore binria com as seguintes restries: 1) As informaes contidas nos ns da rvore so comparveis entre si; 2) A informao em cada n pai maior ou igual que as dos seus ns filhos; 3) uma rvore completa, i.e., est cheia at ao penltimo nvel e todos os ns do ltimo nvel esto dispostos da esquerda para a direita. c) Quantas folhas tem a rvore? Indique os seus valores. A rvore tem trs folhas. 30, 20 e 21. d) Qual a profundidade da rvore? Justifique. A profundidade da rvore igual a 4. A profundidade de uma rvore a dimenso do maior caminho, em que caminho a sequncia de ns entre a raiz e uma folha. e) A rvore equilibrada? Justifique. No. A altura da rvore direita da rvore com raz 60 igual a 2 enquanto a rvore esquerda tem altura 0. Ver definio na Documentao das Aulas Tericas sobre rvores. f) O que entende por travessia prefixa duma rvore binria? Escreva a sequncia que se obtm com a travessia prefixa da rvore dada. Ver definio na Documentao das Aulas Tericas sobre rvores. Sequncia: 80 70 55 30 20 60 46 21

2. Construa uma rvore binria de pesquisa inserindo os seguintes valores pela ordem em que se apresentam: 24, 50, 32, 7, 18, 12, 43, 6, 28. Anlogo ao exerccio 1 da folha 7 das TP sobre rvores binrias de pesquisa. Ver resoluo na pgina da disciplina (Documentao das Aulas Prticas).

Grupo 2 [3 valores] A funo factorial actua sobre nmeros inteiros no-negativos e define-se matematicamente como
se n = 0 1, factorial (n) = n factorial (n 1), se n > 0 a) Escreva uma funo recursiva, na linguagem C, que permita calcular a funo factorial.

b) Faa um esquema que ilustre as chamadas recursivas executadas ao invocar factorial(3). c) Escreva a funo factorial de forma iterativa. Ver resoluo no GU-ProgII-OL-2010/2011-2-recurso (Documentao das Aulas Tericas).

Grupo 3 [4,5 valores] Considere a seguinte implementao dinmica de lista ligada de inteiros
typedef struct lista *Lista; typedef struct node *NoPtr; struct node { int elem; NoPtr prox; }; struct lista { NoPtr cabeca; }; /* apontador para no' */ /* dados de um no */

/* armazena dados de uma lista */

a) Escreva, na linguagem C, a funo ap_menor que dada uma lista de inteiros no ordenada, cujos elementos so todos diferentes, devolve um apontador para o menor elemento da lista.
/* Devolve um apontador para o n com o menor valor da lista */ /* pre: !lista_esta_vazia( l ) */ NoPtr ap_menor( Lista l ) { NoPtr aux = l->cabeca; NoPtr menor = aux; while ( aux->prox != NULL ) { aux = aux->prox; /*para no comparar com o primeiro, que usado para inicializar o menor*/ if ( aux->n < menor->n) menor = aux; } return menor; }

b) Escreva, na linguagem C, a funo remove_menor, que apaga o menor elemento de uma dada lista nas condies acima. Nota: Pode invocar a funo ap_menor mesmo que no tenha resolvido a alnea anterior.
/* Remove o menor elemento da lista */ /* pre: !lista_esta_vazia( l ) */ void remove_menor(Lista l) { NoPtr menor=ap_menor(l); NoPtr aux = l->cabeca; if (aux==menor) { /*remove o o primeiro elemento da lista*/ l->cabeca=l->cabeca->prox; } else{ while (aux->prox!=menor) aux=aux->prox; aux->prox=menor->prox; } free(menor); }

c) Explique a diferena entre as polticas de insero e remoo do TDA fila e do TDA lista. Numa fila, os elementos so inseridos no fim e removidos no incio, enquanto que numa lista a insero e remoo podem ser realizadas em qualquer posio.

Grupo 4 [4 valores] Considere o algoritmo de ordenao concretizado na funo ordena


void trocar( int v[], int i, int j ) { int t = v[ i ]; v[ i ] = v[ j ]; v[ j ] = t; } void ordena( int v[], int inicio, int fim ) { int i, j; for ( i = inicio + 1; i <= fim; i++ ) { for ( j = i - 1; j >= inicio; j-- ) if ( v[j + 1] < v[ j ] ) trocar( v, j, j + 1 ); } }

a) Explique como funciona este algoritmo. Exemplique com a seguinte sequncia de valores 6, 5, 1, 9, 4, 3. Copiar as funes para ficheiros e testar a impresso dos vrios passos. 651943 i=1 561943 i=2 516943 156943 i=3 156943 i=4 156493 154693 145693 i=5 145639 145369 143569 134569 Em cada passo do ciclo externo, o vector est dividido em duas partes: uma parte ordenada e uma parte no ordenada. Inicialmente a parte ordenada formada pela posio zero. Em cada passo do ciclo externo, o 1 elemento da parte no ordenada colocado na posio correcta da parte ordenada. Para esse efeito comparado com os elementos da parte ordenada, comeando as comparaes com o elemento na ltima posio da parte ordenada. b) Qual a complexidade da funo trocar? Justifique. A funo trocar tem uma declarao e trs atribuies. O(1+1+1+1) = O(4) = O(1) c) No pior caso, qual o nmero de operaes elementares da funo ordena? E qual a sua complexidade? Justifique. O nmero total de comparaes n2+3n-1. A ordem de complexidade O(n2). A resoluo anloga da alnea h) do exerccio 1 da folha 3 sobre complexidade. Ver resoluo na pgina da disciplina (Documentao das Aulas Prticas). d) Explique de que forma o algoritmo de ordenao por insero (insertion sort), apresentado nas aulas, melhora este algoritmo. Ver na Documentao das Aulas Tericas sobre Ordenao o algoritmo insertion sort . O insertion sort faz no mximo, no seu ciclo interno, i deslocamentos e cada um gasta 1 operao. A funo trocar gasta 3 operaes em cada. Relativamente s comparaes, no insertion sort o ciclo interno tambm pra se encontrar um elemento menor.

Anda mungkin juga menyukai