lista de exercícios – parte 3: strings - ufjf.brcios-parte-3.pdf · ... parte 3: strings ... os...
TRANSCRIPT
Lista de exercícios – Parte 3: stringsEstrutura de Dados II – Prof. Jairo Francisco de Souza
Departamento de Ciência da Computação – Universidade Federal de Juiz de Fora
– Para uma uma árvore digital criada para armazenar chaves derivadas do alfabeto formato pelos n primeiros números inteiros começados de zero, pede-se:
– Construa o algoritmo recursivo de busca de uma dada chave– Construa o algoritmo recursivo de inserção de uma dada chave– Construa o algoritmo recursivo de remoção de uma dada chave
– Implemente um algoritmo de busca e inserção para uma árvore ternária digital (TST – Ternary Search Tree), considerando a seguinte estrutura de nó:
struct No { No *esq, *dir, *meio; int valor; bool ehChave = false;}
– Criar um algoritmo para testar se uma árvore digital é uma árvore digital de prefixo.
– Crie um algoritmo de busca e um algoritmo de inserção em uma árvore PATRICIA com alfabeto binário.
– Implemente o algoritmo força-bruta para busca de padrões que imprima na tela a quantidade de comparações realizadas para uma dada busca do padrão P no texto T.
– Dado uma cadeia de caracteres C, implemente uma função que calcule a tabela de prefixo do algoritmo KMP.
– Implemente o algoritmo KMP.
– No método BM, são utilizadas heurísticas de ocorrência e de casamento. Na heurística de ocorrência proposta, é necessário alinhar a posição que causou colisão no texto com o primeiro caractere no padrão que casa com este caractere. Apresente uma forma de implementação da tabela de deslocamento para esta heurística.
– Considerando a existência da tabela de deslocamento de ocorrência e de casamento, implemente o algoritmo BM. O acesso à tabela de ocorrência é feita através do método int getDeslOcorr(int posPadrao, char letraTexto). Já o acesso à tabela de casamento é feita através do método int getDeslCasam(int posPadrao, posTexto).
– Para o algoritmo BMH, implemente a função que retorna a tabela de deslocamento.
– Para o algoritmo BMHS, implemente a função que retorna a tabela de deslocamento.
– Implemente os algoritmos BMH e BMHS.
– Dada função de hashing h(x) = x mod 1003, implemente um algoritmo para realizar o pré-processamento do padrão P no algoritmo de Robin-Karp.
– Implemente a busca de padrões utilizando a abordagem de Robin-Karp sem armazenar
os valores de hashing das substrings em tabelas.
– Considerando duas matrizes bidimensionais P e T, utilize a abordagem de Robin-Karp para descobrir se a matriz P ocorre em T. Implemente o algoritmo de busca.
– Considerando um alfabeto formado somente por letras de A a Z, implemente um algoritmo de compressão que utilize a abordagem RLE (Run-length encoding) para comprimir uma sequência de caracteres.
– Implemente o algoritmo de decodificação para o algoritmo acima.
– Considerando uma cadeia de caracteres C, implemente um algoritmo para calcular a frequência de ocorrência de cada caractere e retorne uma tabela ordenada por maior frequência.
– Dado uma árvore de Huffman, monte uma tabela contendo o código a ser utilizado para comprimir cada caractere contido na árvore. A tabela a ser retornada deve ser uma matriz com duas colunas, onde a segunda coluna contém o código correspondente ao caractere contigo na primeira coluna.
– Dada uma sequência de caractere e uma tabela como a retornada no exercício anterior, crie uma função de Huffman que retorne o código comprimido para a sequência de entrada. Para facilitar, considere o código comprimido como sendo uma cadeia de caracteres, ao invés de uma sequência de bits.
– Dado um código comprimido e uma árvore de Huffman, crie uma função para descomprimir a sequência de entrada. Para facilitar, considere o código comprimido como sendo uma cadeia de caracteres, ao invés de uma sequência de bits.
– Dada uma tabela com as frequências de cada caractere em um dado texto, implemente um algoritmo para criar uma árvore de Huffman. Como sugestão, pode-se pensar na implementação através de um vetor (como na implementação do heapsort).
– Dado a entrada CORROCOCOGAOCOR, mostre passo-a-passo da construção da árvore de Huffman utilizando a abordagem adaptativa.
– Decodifique o a seguinte sequência criada com Huffman adaptativo: e 0s 00t 100r 000u 01 1101 111 1100a 10 00 1111 11101 0001 111 01 110.
– Implemente os algoritmos de codificação LZ77, LZ78 e LZW.
– Implemente os algoritmos de decodificação LZ77, LZ78 e LZW.
– A cada passagem do algoritmo de compressão LZ77, é gerado uma tupla (m, l, c), onde m é o deslocamento à direita dentro do dicionário, l é a quantidade de caracteres lidos de forma circular no dicionário e c é o próximo caractere do buffer. Considere que a tupla (m, l, c) possa ser representada como MLC, ou seja, toda a tupla pode ser representada com 3 caracteres. Por exemplo, a tupla <3, 2, h> seria representada como 32h. Considere também que as tuplas são representadas sem espaço, ou seja, 00x11y representa as tuplas <0,0,x><1,1,y>. Pede-se:
– Qual o melhor caso para o algoritmo LZ77? Mostre um exemplo.– Considerando-se tb, td e tt como, respectivamente, o tamanho do buffer, o tamanho
do dicionário e o tamanho do texto, qual a melhor taxa de compressão que o algoritmo pode
alcançar, aproximadamente?
– Seguindo o mesmo raciocínio do exercício anterior, qual seria a melhor taxa de compressão possível para o algoritmo LZ78?
– Faça um algoritmo em pseudo-código de alto nível para representar a busca em um sistema de recuperação de informação em que utiliza arquivos invertidos na abordagem TF-IDF.