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

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

Recurso, 1999/2000, 25/7/2000

1/

Erros:

linha 4: não é necessário template <..> já que o tipo T nunca mais é usado

linha 7: tirar void da declaração do construtor inicializador no "cabeçalho" da função;  ordem das atribuições está errada (linha 8)
         serieGeometrica (double a0, double r = 1) : elem0(a0), razao(r) {}

linha 9: a função-membro elem() deve retornar um double
         double elem(int i) const

linha 16: as variáveis devem ser declaradas antes de serem usadas
          double a0, r; int n; cin >> a0 >> r >> n;

linha 17: se o erro da linha 4 não foi detectado, a declaração de s  está errada já que não especifica T

linha 18: incremento de i está errado;  valor inicial de i errado (i>=1)
          for (int i = 1; i <= n; i=i+1)

Saída:

a1=1
a2=2
a3=4
a4=8

Se o valor inicial de i não for ajustado (linha 18) a saída anterior é precedida de uma linha com
a0=0.5

2/

template<class T>
Chain<T>::Chain(const Chain<T> & C)
{
  first=0;
  ChainNode<T> * auxiliar=C.first;
  int i=0;
  while(auxiliar)
  {
    Insert(i,auxiliar->data);
    i++;
    auxiliar=auxiliar->link;
  }
}

3/

template<class T>
int BinarySearchTree<T>::ContaIntervalo(const T & inferior, const T & superior)
{
  return containtervalo(root,inferior,superior);
}

template<class T>
int BinarySearchTree<T>::containtervalo(BinaryNode<T> * t, const T & inferior, const T & superior)
{
  int count=0;
  if(t)
  {
    if(t->data > inferior && t->data < superior) count++;
    if(t->data > inferior) count+=containtervalo(t->left,inferior,superior):
    if(t->data < superior) count+=containtervalo(t->right,inferior,superior);
  }
  return count;
}

ou, em alternativa (menos eficiente porque não tira partido da árvore ser uma árvore binária de pesquisa):

template<class T>
int BinarySearchTree<T>::ContaIntervalo(const T & inferior, const T & superior)
{
  return containtervalo(root,inferior,superior);
}

template<class T>
int BinarySearchTree<T>::containtervalo(BinaryNode<T> * t, const T & inferior, const T & superior)
{
  if(!t) return 0;
  if(t->data > inferior && t->data < superior)
     return 1 + containtervalo(t->left,inferior,superior) + containtervalo(t->right,inferior,superior);
  return containtervalo(t->left,inferior,superior) + containtervalo(t->right,inferior,superior);
}

4/

Usar uma árvore de pesquisa binária em que cada nó contém a palavra e o número de ocorrências respectivo.
Para cada palavra verificar se existe na árvore; se existir, incrementar o seu contador; se não existir inseri-la com contador = 1.
Árvore de pesquisa: pesquisa logarítmica;  ordem alfabética => percorrer árvore em-ordem e imprimir
Sendo n o número de palavras distintas e N o número total de palavras temos complexidade espacial: O(n) e complexidade temporal: O(N lg n)

Alternativas:
1) tabela de dispersão: acessos mais rápidos mas não permite obter as palavras por ordem alfabética; (opção: copiar para vector e ordenar)
2)lista ordenada: pesquisa/inserção de um elemento é linear => O(N ^2) (alternativa inferior)


[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: Sat Jul 29 08:51:12 2000