Faculdade de Engenharia da Universidade do Porto
Licenciatura em Engenharia Electrotécnica e de Computadores
Algoritmos e Estruturas de Dados, 1998/99

Resolução de Prova de Avaliação:

//pergunta 1, 2a. chamada, 1998/99, JCL
// erros
6       : x(x1), y(y1) { r= r1; }
17   Circulo c2(1.0);
// resultados
28.26 // 3.14 * 3.0 * 3.0
12.56 // 3.14 * 2.0 * 2.0

//pergunta 2, 2a. chamada, 1998/99, JCL
template<class T>
void Queue<T>::Retira(T valor, Queue<T> & f) const
{
   T x;
   // ver fig 6.5 para calcular o número de elementos da fila
   for (int i= (MaxSize+rear-front)%MaxSize); i>0; i--)
   {
      Delete(x);
      if (x != valor )
         f.Add(x);
      else Add(x);
   }
};

//pergunta 3, 2a. chamada, 1998/99, MTA
template<class T>
int BinaryTree<T>::NoNos(T v)
{
   return NoNos(root, v);
}

template<class T>
int BinaryTree<T>::NoNos(BinaryTreeNode<T> *t, T v)
{
   int count=0;
   if(t)
   {
      if(t->data > v)
         count++;
      count += NoNos(t->LeftChild, v) + NoNos(t->RightChild, v);
   }
   return count;
}

//pergunta 4, 2a. chamada, 1998/99, MTA
1. Estruturas de Dados:
uma tabela de Hash, com função fhash(), em que cada posição da tabela tem um campo numérico inicializado a zero no arranque do programa, e uma fila (f) para ir guardando os valores que se pretende preservar na saída.

2. Algoritmo:

enquanto existirem valores de entrada
{
    le valor para uma variavel do tipo T;
    se fhash(valor)==0 
        f.Add(valor);
    fhash(valor)++;
}
Sempre que se recebe um valor de entrada, esse valor é utilizado como chave para aceder á tabela de Hash; se o campo numérico da posição acedida através dessa chave tiver o valor 0, então é porque se trata da 1a. ocorrência do valor de entrada que se está a analisar e nesse caso este é adicionado á fila e o campo numérico da posição acedida da tabela de Hash é colocado a 1; se o campo numérico da posição acedida já tiver um valor diferente de zero, então é porque se trata de uma ocorrência duplicada do valor em análise e nesse caso ele não é colocado na fila de saída.

3. Nota: Em vez de uma tabela de Hash também se poderia utilizar uma lista ligada para ir armazenando os valores à medida que iam chegando, fazendo nessa mesma altura a detecção de ocorrências duplicadas ou não do valor de entrada em análise e tomando as acções necessárias para passar ou não os valores para a fila ligada de saída. A complexidade temporal do algoritmo que detecta o no. de ocorrências do valor em análise seria diferente. Para cada valor de entrada seria necessario percorrer a lista ligada desde o nó inicial e até se verificar uma das duas seguintes condições: encontrar um nó cujo campo data-valor tivesse um valor igual ao valor de entrada em análise, ou chegar ao fim da lista. Em cada nó da lista ligada, o campo data teria que ser uma estrutura de dados com os seguintes componentes: campo genérico T para guardar o valor de entrada (data-valor) e campo numérico para guardar o número de ocorrências do respectivo valor de entrada (data-NumeroDeOcorrencias).


[Página da disciplina] [J. Pascoal Home page] [J. Lopes Home page]
João Pascoal de Faria ([email protected]) / João Correia Lopes (jlopes AT fe.up.pt)

Last modified: Wed Jul 28 08:52:26 1999