Skip Calendar

Calendar

Sun Mon Tue Wed Thu Fri Sat
Today Domingo, 1 Setembro 1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30      

Events Key

Skip ActivitiesSkip Administration

Administration

Skip Course categories

Topic outline

 

Recursos para a Cadeira

 
1

Introdução (noções básicas de algoritmos em C)

  • Exercício 1
    • Desenvolva, em C, um programa 'HelloWorld'.
    • Crie uma função int impar(int x), que verifica se o número inteiro dado como parâmentro é ímpar. Utilize a seguinte função main() para testar:
           int main()
    {
    int i = 3;

    if (impar(i)) {
    printf("%d é um número ímpar.\n", i);
    }
    else {
    printf("%d não é um número ímpar.\n", i);
    }
    }
    • Crie um procedimento void primos(int x), que mostra todos os números primos de 1 a x.
  • Correcção do Exercício 1 zip archive
Show only topic 1
2

TAD: Listas, Filas e Pilhas

  • Exercício 2

    Considere o TAD fila e a implementação dada na teórica (ficheiros: tad_fila.h, tadfila.c e fila_main.c).
    1. Altere a disciplina da fila, que é fifo (primeiro a entrar é o primeiro a sair) para lifo (o primeiro a entrar é o último a sair).
    2. Implemente a operação remove(int valor), que deve remover o valor indicado da fila.
    3. Implemente a operação insere_apos(int valor1, int valor2), que deve inserir o valor1 após o valor2 na fila.
    4. Reimplemente o TAD fila usando os seguintes tipos para lista, fila:
      struct lista{int val[34];}
      struct fila {int cabeca, cauda; struct lista l;};

      Implementando a nova operação int fila_cheia(fila f) que retorna True (?o que é True em C?) quando a fila tem 34 valores.

    5. Reimplemente o TAD fila com as operações remove(int valor) e insere_apos(int valor1, int valor2), usando o seguinte tipo para lista:
      struct lista{ int val;
      lista *prox;
      lista *ant;};
    6. Para cada implementação do tipo fila indique a complexidade (função do número de elementos na fila) da sua implementação das operações sobre o tipo fila.
    NOTA: Esta semana não há exercício para entregar.
Show only topic 2
3

TAD: Red-Black Trees

  • Exercício 3

    Considere o TAD rbt e a implementação dada na teórica (ficheiro: rbt.tgz) (rot_dir.c)

    1. (para fazer numa folha de papel)
      Insira os seguintes valores numa rbt: 12 14 15 17 2 3 5 8 1 10; pela ordem indicada.
      Indique para cada inserção qual a rbt obtida.
    2. Implemente a operação altura_preta de uma rbt.
      teste a sua função para diferentes rbts.

    3. Implemente a operação maximo_rbt, que deve retornar a maior chave. (correcção)

    4. Implemente a operação minimo_rbt, que deve retornar a menor chave.

    5. Implemente a operação lista_ord_rbt, que deve listar os elementos por ordem crescente ou decrescente, de acordo com um parâmetro booleano passado à função. (correcção)

    6. Implemente a operação é_rbt que dada uma struct rbt verifica se as 4 propriedades se verificam.
      1. Um nó ou é preto ou vermelho
      2. Uma folha (NIL) é preta.
      3. Se um nó é vermelho então os seus dois filhos são pretos
      4. Qualquer caminho de um nó a uma folha tem sempre o mesmo número de nós pretos.
      (correcção)
  • ADA - Exercício para entregar (3) Assignment

  • Exercício 3.2

    1. (para fazer numa folha de papel)
      Numa rbt vazia, insira os valores 4, 8, 2, 14, 11, 23, 30, 1 e 10.

    2. Na rbt anterior, remova os valores 11, 4 e 23.

    3. Implemente a função struct rbt *pesquisa(struct rbt *arv, int val), que devolve o nó da rbt cujo valor é val.

    4. Implemente a função struct rbt *sucessor(struct rbt *arv, int val), que devolve o nó sucessor do nó cujo valor é val.

  • ADA - Exercício para entregar (3.2) Assignment
Show only topic 3
4

TAD: B-Trees

  • Exercício 4

    Considere o TAD Btree e a implementação dada na teórica (ficheiro: btree.tgz):
    1. Desenhe (em papel) a B-Tree de grau minimo 3 que se obtem após a inserção de cada elemento da seguinte sequência de chaves:
      8, 16, 24, 32, 64, 1, 4, 7, 3, 25, 28, 31, 27, 40, 41, 42, 43, 44, 45, 47, 49, 46, 50.
    2. Defina a operação pesquisa que dada uma Btree e uma chave devolve true sse a chave está na Btree.
    3. Defina a operação máximo que dada uma Btree devolve a maior chave na Btree.
    4. Defina a operação num_chaves que dada uma Btree devolve o número de chaves na Btree.
    5.  Defina a operação num_nos que dada uma Btree devolve o número de nos na Btree.
    6. Altere o tipo Btree e a implementação das operações de forma a que as chaves sejam strings em vez de inteiros.
  • ADA - Exercício para entregar (4) Assignment
Show only topic 4
5

TAD: Tries

  • Exercício 5

    Considere o TAD trie e a implementação dada na teórica (ficheiro .tgz com a base):

    1. Usando papel e lápis, insira os seguintes valores numa trie: "abc", "abcde", "efg", "efgaa" e "bfg", pela ordem indicada. Indique para cada inserção qual a trie obtida.
    2. Usando o papel da alínea anterior, remova os seguintes valores da trie: "abc" e "efgaa", pela ordem indicada. indique para cada remoção qual a trie obtida.
    3. Implemente a operação remove que dada uma chave e uma trie remove a chave da trie.

      Teste a sua função com as remoções da alínea 2.

    4. Implemente a função mínima que devolve a menor chave na trie.

      Teste a sua função com as tries da alínea 1.

    5. Implemente a operação pesquisa, que dada uma chave devolve true se ela está na trie, false senão.

      Teste a sua função para as diferentes tries da alínea 1.

    6. Implemente a operação próxima, que dada uma chave devolve a próxima chave na trie (ordem alfabética).
    7. Suponha que além de palavras gostaria de guardar num dicionário as linhas onde as palavras ocorrem.
      1. Altere o tipo trie, e a função insere para inserir uma chave e a linha onde ocorre (note que uma palavra pode ocorrer em várias linhas).
      2. Altere a função lista_ord para listar as palavras por ordem alfabética e as linhas onde a palavra ocorre.
      3. Defina a operação palavrasNaLinha que dada uma linha lista todas as palavras que ocorrem na linha.

       

  • ADA - Exercício para entregar (5) Assignment
Show only topic 5
6

Pattern Matching

  • Exercício 6

    1. Defina um função em C que implemente o algoritmo ingénuo para verificação de coincidência de padrões (naive search).
    2. Faça um programa que indique quantas vezes e em que shifts ocorre um padrão p na string t.
      ex:
      p=''123123''
      t=''123456712123123123124123123''
      p ocorre 3 vezes em t em: 9,12 e 21.

    3. Defina uma função em C que implemente o algoritmo Rabin-Karp.

    4. Desenhe os autómatos finitos que reconhecem os seguintes padrões (e construa as funções de transição), para o vocabulário {a,b,c,d}:
      1. p=''aaaaa''
      2. p=''ababa''
      3. p=''abcddcba''

    5. Defina uma função em C que dado um padrão (uma string), e um vocabulário constrói a função de transição do autómato finito que reconhece o padrão.

    6. Defina em C uma função que dado um padrão e um texto (duas strings) usa um autómato finito para encontrar o shift do padrão no texto.
Show only topic 6
7

Grafos

  • Exercício 7

    Considere os Grafos:

    $G1= \{\{1,2,3,4,5,6,7,8\},(1,2),(1,3),(2,6),(3,6),(3,8),$$(4,7),(5,6),(5,2),(5,7),(6,7),(7,3),(8,4)\}$

    $G2=\{\{0,1,2,3,4,5,6,7,8\},\{(0,2),(0,3),(1,3),(2,3),(2,5),$$(5,8),(6,5),(6,7),(7,8)\}$

    1. Para o grafo G1 indique qual é o resultado da pesquisa em largura (bfs), iniciada no vértice 1. i.e quais as anotações em cada nó do grafo após a pesquisa. Desenhe a árvore em largura.
    2. Para o grafo G2 indique quais as anotações nos nós feitas pela pesquisa em profundidade (dfs). Desenhe as árvores em profundidade.
    3. Usando a implementação do tad grafos dada na teórica (ficheiros grafo.c, grafo.h e grafosmain.c - grafos.tgz) e pesquisa em largura (bfs)
      1. Defina a função caminho2 que dados um grafo e dois vertices lista o menor caminho entre os dois vertices (os vertices do caminho) e a distância minima entre os dois vertices.
      2. Defina a função caminho3 que dados um grafo e três vertices (u, v, e x) lista o menor caminho entre u e v que passa por x.

    4. Usando as estruturas de dados e as funções definidas para representar grafos dadas na teorica:
      1. Implemente a função pesquisa em profundidade (dfs) dada nas aulas (acrescente int ti e int tf a struct vertice para poder anotar os tempos de visita de cada nó).
      2. Defina a função ordena vertices que dado um grafo directo sem ciclos, usando a sua função (dfs), lista uma linearização do grafo (ordenação topologica).
Show only topic 7
This topic 8

Códigos de Huffman

  • Exercício 8


    1. Construa a árvore de Huffman e a tabela de códigos para o texto seguinte: ``O rato roeu a rolha da garrafa do rei do russia''
    2. Codifique o texto de acordo com a sua tabela.
    3. Qual a Coeficiente de compressão do texto?

      (Q $_c =\frac{tamanho\_do\_texto\_comprimido}{tamanho\_do\_texto\_original}$)
      nota: junto com o texto codificado tem que guardar a árvore de huffman.

    4. Qual é a taxa de compressão do texto? ($\frac{1}{Q_c}$)
    5. Para construir a árvore de huffman é necessário construir uma tabela de frequências dos simbolos no texto.

      Faça uma função que leia o texto do stdin e construa a tabela de frequências sabendo que o texto pode conter qualquer simbolo do código ascci.

      Use a seguinte tabela:

      int freq[256];

    6. Defina uma função para construir a árvore de huffman a partir da tabela de frequencias (int freq[256];).

      Pode usar o seguinte tipo para representar a árvore de huffman:

      struct ab{ int freq;
      char s;
      struct ab *esq;
      struct ab *dir;
      };
      Nota: Cada simbolo com frequência diferente de 0 deve ser introduzido, por exemplo num vector (ex: struct tabela codigos[256];) ordenado (decrescente) pela frequência do simbolo. A sua função deve retirar as árvores com menor frequência e juntá-las numa e inserir a nova árvore na estrura ordenada (ex:vector). Este procedimento deve ser repetido até só existir uma árvore na estrutura. 
    7. Defina uma função que dada uma árvore de huffman constrói uma tabela com os códigos dos simbolos do texto. Pode usar a seguinte estrutura para representar a tabela:
      struct tabela{char *codigo;
      int numbits;};

      struct tabela codigos[256];
    8. Defina uma função que dada uma tabela com os códigos de huffman e uma string com o texto a codificar escreve no stdout o código da string de acordo com a tabela.

      Nota: para fazer um shift para a esquerda basta multiplicar por 2 ou usar o operador <<

      ex:

      unsigned char x=1; /* x=0000 0001  em binário*/
      x=x*2; ou x = x <<1; /* x=0000 0010 em binário*/

      Se a codificação do seu texto não for um multiplo de 8 não se preocupe, apesar de no stdout só poder escrever palavras com um minimo de 8 bits.

    9. Defina a uma função que dada uma árvore de huffman a escreve no stdout de forma a que possa ser reconstruída quando for lida por outro programa.
Show only topic 8
Skip Upcoming Events

Upcoming Events

There are no upcoming events
Skip Latest News

Latest News

  • 18 Jul, 11:46
    Irene Rodrigues
    Notas do exame de recurso more...
  • 22 Jun, 15:29
    Irene Rodrigues
    notas T1 + E1 more...
Skip Recent Activity

Recent Activity

Activity since Sexta, 30 Agosto 2019, 08:13

Nothing new since your last login

Skip Search Forums

Search Forums