Você está na página 1de 5

Relatório técnico - Grupo 10

Integrantes: Neemias Calebe, Markesley Ramos e Daniel Lima

Disciplina: Estrutura de Dados

09 de Novembro de 2021

Tabelas Hash

Introdução:

De início, afirmamos que todos os integrantes do grupo participaram ativamente das

discussões e da implementação do trabalho.

Questão 1: Eliminar as palavras repetidas do arquivo tale.txt (disponível no google drive da


turma). Depois, fazer um histograma como o mostrado na aula sobre Tabela Hash, mas
usando M = 100.
R – As seguintes etapas foram realizadas nessa questão:

 Eliminação das Palavras Repetidas: Inicialmente essa questão requisita que as palavras repetidas sejam
eliminadas então para remover os nomes repetidos o arquivo é lido e seus nomes são armazenados em
um arrayList de forma que um nome que já está contido no arrayList não possa ser armazenado
novamente, então é criado um novo arquivo chamado “talemodificado.txt” que recebe a todos os
nomes contidos no arrayList, criando assim um arquivo sem palavras repetidas.

 Criação e Preenchimento da Tabela Hash: A tabela hash, pega do livro e utilizando a função hash:
HashTextBook, é primeiramente instanciada com seu M = 100 e logo em seguida usando de um loop
while() o arquivo “talemodificado.txt” é lido e cada uma de suas linhas é posta na tabela hash, em
seguida a quantidade de elementos dentro da tabela hash é impressa.

 Histograma:

Este exemplo conta com um M = 100 e um total de 19695 elementos tendo um fator de carga de 197
Questão 2: Fazer um histograma para as palavras do arquivo tale.txt (sem repetições), com
M = 97, mas alguma função de hashing diferente da usada na questão acima.
R – Nessa Questão foi utilizado a função Hash e este foi o histograma resultante:

Como esta função Hash retorna muitos valores iguais, as posições acabaram sem muita variação acabando
longe de seu fator de carga que neste caso é de aprox. 197, mostrando sua diferença com a função
HashTextBook que possui o mesmo fator de carga e consegue atende-lo de forma muito melhor.

Questão 3: Repetir os experimentos com o arquivo tale.txt usando valores de M diferentes de


97 (tente valores que são potência de 2, por exemplo, 32, 64, 128).
R – Nesta questão resolvemos fazer 2 histogramas, um para M = 32 e outro para M = 128, seguem os graficos:

Para M = 128 temos um fator de carga de 153,87


Para M = 32 temos um fator de carga de 615,47

Questão 4: Responder à pergunta: Podemos ter 𝛂 < 1 numa tabela de hash com
encadeamento? Justificar a resposta.
R - Sim. Como alfa é calculado pela divisão de N(número de chaves) pelo M(Número de posições da tabela)
para que alfa seja menor que 0 basta que o N seja menor que M.

Questão 5: Inserir manualmente as chaves E A S Y Q U T I O N F C L, nessa ordem, usando


hashing com encadeamento, em uma tabela com M = 5 listas. Use a função de hashing 11*k %
M para transformar a k-ésima letra do alfabeto em um índice da tabela de hash. (Obs:
considerar a letra A=1, B=2, C=3, …)
R - R:
Chave K Cálculo da Hash

E 5 0

A 1 1

S 19 4

Y 25 0

Q 17 2

U 21 1

T 20 0

I 9 4

O 15 0

N 14 4

Tabela Hash

Posição | Chaves
0 OTYE
1 UA
2 Q
3
4 NIS
Questão 6: Discutir a complexidade da implementação das operações: min(), max(), floor() e
ceiling() em tabelas de símbolos implementadas com tabelas de hash?

R - Devido a forma como uma tabela hash insere seus elementos é esperado que eles não estejam ordenados,
logo a operação min() precisaria varrer toda a tabela em busca do menor elemento já que este pode se localizar
em qualquer posição da tabela, sendo o mesmo valido para a operação max() que retorna o maior valor na
tabela e precisaria varre-la pois o mesmo poderia estar em qualquer posição. Enquanto isso as operações
floor() e ceiling() apesar de sofrerem da mesma maneira podem ser mais rapidas caso a pesquisa se inicie na
posição do elemento passado na função pois as funções pedem <= e >= respectivamente, resultando no melhor
caso se o elemento estiver na tabela, e em caso de o elemento não ser encontrado na tabela a pesquisa pode a
partir dali conferir as chaves anteriores a ele no caso da função floor() e as chaves superiores no caso da
função ceiling() já que as chances de elementos menores e maiores estarem nessa ordenação é maior.

Você também pode gostar