Neste exercício iremos implementar a inclusão e exclusão de valores em tabela hash de endreçamento aberto.
Considere como exemplo a inclusão das seguintes chaves em sequencia: k = {10, 22, 4, 15, 59}. A imagem abaixo mostra as tabelas T1 e T2 após as inclusões e um log das operações. As chaves 10 e 22 não tiveram colisão. As chaves 4, 15 e 59 tiveram colisão. Em T1 somente deve ficar a chave 59, pois foi a última a ser inserida. As chaves 4 e 15 foram movidas para T2 seguindo o algoritmo e estão escritas em vermelho em T1 somente para mostrar que foram retiradas de T1. Como não nos preocuparemos com rehashing, os casos de teste não terão colisão em T2.
Considere como exemplo a exclusão das seguintes chaves em sequencia: k = {15, 22, 59}. As posições das chaves 22 e 59 em T1 foram marcadas como excluida pois não sabemos se existem chaves em T2 que dependem dessa posição para a busca.
A entrada deve ser feita pela entrada padrão (stdin
). O arquivo é formado por uma sequência de linhas, onde cada linha representa uma operação com uma chave inteira. A ordem das operações é aleatória. Cada operação pode ser de inclusão (i) ou remoção (r).
O primeiro campo é o tipo da operação e o segundo campo é a chave. Por exemplo, "i 10" significa a inclusão da chave 10 na tabela hash.
A saída deve ser feita pela saída padrão (stdout
). A escrita na saída pode acontecer ao final das operações de entrada. O arquivo será composto por uma sequência de linhas. Uma linha para cada valor lido no formato (chave, tabela, posição). Portanto, cada linha tem 3 campos separados por vírgula. O primeiro campo é a chave armazenada em uma das tabelas hash. O segundo campo é o nome da tabela hash de armazenamento: T1 ou T2. O terceiro campo é a posição da chave em T1 ou T2. A saida será ordenada pelo primeiro campo, seguido pelo segundo e terceiro campos.
Exemplo de arquivos com uma entrada e uma saída válida:
Entrada | Saída |
i 10
i 22
i 4
i 15
i 59
r 15
r 22
r 59
|
4,T2,6
10,T1,10
|
O trabalho deve ser feito em linguagem de programação C/C++ de forma que possa ser compilado e executado nas servidoras de computação do Departamento de Informática. Além disso, o executável não deve ter nenhuma opção de linha comando. O nome do executável deve ser: myht.
Além dos arquivos fonte, deve acompanhar um makefile
e um relatório com no máximo 2 páginas contendo a documentação sintetizada do sistema implementado. Qualquer particularidade deve estar descrita neste texto. Relatórios sem os nomes dos alunos não serão corrigidos.
Para compilar será usado o comando make
(sem nenhum parâmetro), portanto preparem o Makefile para fazer isso.
Para testar será executado um script como o abaixo.
$ ./myht < teste.in > teste.out $ diff teste.sol teste.outOnde
teste.in
é o arquivo de entrada do teste e teste.sol
é o esperado como saída.O trabalho deve ser empacotado em um arquivo login.tar.gz, onde "login" é uma string com o login do aluno nas servidoras do DInf. Ao descompactar este arquivo deverá ser criado um diretório de nome "login" que conterá todos os demais arquivos. O make
e o script acima deverão funcionar dentro deste diretório (não em subdiretórios).
Este arquivo deve ser enviado por e-mail ao endereço do professor com o assunto "CI057-trab2" (exatamente). IMPORTANTE: Minha caixa de email usa o assunto do email como filtro.
O trabalho pode ser realizado em equipe de até 2 alunos.