2o Exame de Análise e Desenho de Algoritmos Licenciatura em Engenharia Informática Departamento de Informática Universidade de Évora 12 de Julho de 2002 1. [4 valores] Apresente a trie resultante de inserir sucessivamente, numa trie inicialmente vazia, as palavras da sequência: agrado, sorte, cal, agricultura, bata, agradece, calma, massa Considere que o alfabeto é constituı́do pelas 26 letras minúsculas. 2. [4 valores] Construa a árvore de Huffman para a sequência de sı́mbolos ADCEEAEBACCCBEECAA, sobre o alfabeto Σ = {A, B, C, D, E}, e apresente o código de Huffman de cada sı́mbolo. Calcule o ganho de compressão obtido com a codificação desta sequência. (Considere que cada sı́mbolo tem, originalmente, um código de 3 bits.) 3. [4,5 valores] Apresente o autómato finito para pesquisa de texto correspondente ao padrão yyxzyyxyyy e indique, justificando, o número de comparações de caracteres efectuadas durante a pesquisa de todas as ocorrências deste padrão no texto yyxzyyxyyyxzyyxyyy (excluindo eventuais comparações de caracteres feitas para o cálculo da função de transição do autómato). 4. [4,5 valores] Seja t o grau mı́nimo de ramificação de uma árvore B de inteiros. Implemente, em C, a função soma k menores que devolve a soma dos k menores elementos de uma árvore B, para 0 < k < t, e indique, justificando, a sua complexidade temporal. Assuma que a árvore tem, pelo menos, k elementos. Considere a árvore B implementada através dos tipos: #define MAXOCUP ... typedef struct Bno { int elementos[MAXOCUP]; struct Bno * filhos[MAXOCUP + 1]; int folha, ocupacao; } Bno; typedef struct { struct Bno * raiz; } Barvore; 5. [3 valores] Na distribuição Debian do Linux, o software está organizado em pacotes. Alguns pacotes dependem de outros, i.e., não podem ser instalados se outros não estiverem também no sistema. Por exemplo, o pacote acroread (o Acrobat Reader para Linux) depende dos pacotes libc6 (biblioteca base do sistema) e xlibs (bibliotecas do sistema de janelas X); este último, por sua vez, depende de xfree86-common, libc6 (também) e libfreetype6, que dependem de outros pacotes, e assim sucessivamente. Como é natural, não existem dependências circulares. Dadas a lista de pacotes a instalar e as dependências entre eles, proponha uma representação desta informação e um algoritmo que determine uma ordem de instalação tal que nenhum pacote seja instalado antes de outro de que ele dependa. Indique, justificando, a complexidade do algoritmo proposto.