Instruções
Construir uma Tabela Hash
Neste laboratório, você construirá uma tabela hash do zero. Uma tabela hash é uma estrutura de dados que armazena pares de chave-valor. Uma tabela hash funciona pegando a chave como entrada e então aplicando uma função de hash específica para essa chave.
Para o propósito deste laboratório, a função de hashing será simples: ela somará os valores Unicode de cada caractere na chave. O valor do hash será então usado como a chave real para armazenar o valor associado. O mesmo valor de hash também seria usado para recuperar e excluir o valor associado à chave.
Objetivo: Cumprir as user stories abaixo e fazer todos os testes passarem para completar o laboratório.
Histórias de Usuário:
1. Você deve definir uma classe chamada
HashTable com um atributo collection inicializado como um dicionário vazio quando uma nova instância de HashTable for criada. O dicionário collection deve armazenar pares chave-valor com base no valor hash da chave.
2. A classe HashTable deve ter quatro métodos de instância: hash, add, remove e lookup.
3. O método hash deve:
- Receba uma string como parâmetro.
- Retorna um valor hash calculado como a soma dos valores Unicode (ASCII) de cada caractere na string. Você pode usar a função
ordpara esse cálculo.
add deve:
- Receba dois argumentos representando um par chave-valor e calcule o hash da chave.
- Use o valor de hash computado como uma chave para armazenar um dicionário contendo o par chave-valor dentro do dicionário
collection. - Se várias chaves produzirem o mesmo valor de hash, seus pares chave-valor devem ser armazenados no dicionário aninhado existente sob o mesmo valor de hash.
remove deve:
- Recebe uma chave como argumento e calcula seu hash.
- Confirme se a chave existe na coleção.
- Remova o par chave-valor correspondente da tabela hash.
- Se a chave não existir na coleção, não deve gerar um erro nem remover nada.
lookup deve:
- Recebe uma chave como seu argumento.
- Calcule o hash da chave e retorne o valor correspondente armazenado dentro da tabela hash.
- Se a chave não existir na coleção, deve retornar
None.
O que fazer:
Testes:
- Você deve definir uma classe `HashTable`.
- Quando uma nova instância da classe `HashTable` é criada, seu atributo `collection` deve ser inicializado como um dicionário vazio.
- A classe `HashTable` deve ter um método `hash`.
- O método `hash` deve receber uma string como parâmetro.
- O método `hash` deve receber uma string como argumento e retornar a soma dos valores Unicode de cada caractere na string.
- A classe `HashTable` deve ter um método `add`.
- O método `add` deve receber uma chave e um valor como parâmetros.
- A classe `HashTable` deve ter um método `remove`.
- O método `remove` deve receber uma chave como parâmetro.
- Quando você tenta remover uma chave que não existe na coleção, **não deve** gerar um erro nem remover nada.
- Se várias chaves fizerem hash para o mesmo índice, o método `remove` deve excluir apenas o par chave-valor específico e não todo o dicionário naquele índice.
- A classe `HashTable` deve ter um método `lookup`.
- O método `lookup` deve receber uma chave como parâmetro.
- `HashTable().hash('golf')` deve retornar `424`.
- `HashTable().add('golf', 'sport')` deve adicionar o par chave-valor à coleção na chave `424`.
- `HashTable().add('dear', 'friend')` e `HashTable().add('read', 'book')` devem adicionar ambos os pares chave-valor à coleção no índice `412` como um dicionário aninhado.
- Quando uma chave existe na tabela hash, o método `remove()` deve remover a chave fornecida e seu valor correspondente da coleção.
- Quando o par chave-valor `'golf', 'sport'` existir na tabela hash, `HashTable().lookup('golf')` deve retornar `sport`.
- Quando o par chave-valor `'golf', 'sport'` não existir na coleção, `HashTable().lookup('golf')` deve retornar `None`.
- Quando a chave `'fcc'` existir na coleção, `HashTable().lookup('cfc')` deve retornar `None`.
- Quando você adiciona `('rose', 'flower')` à tabela hash, seu atributo `collection` deve ficar assim: `{ 441: { 'rose': 'flower' }}`.
- Quando você adiciona uma chave que gera o mesmo valor de hash que uma chave existente, como `fcc` e `cfc`, a `collection` deve ficar assim: `{ 300: { 'fcc': 'coding', 'cfc': 'chemical' }}`.
Preview