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 ord para esse cálculo.
4. O método 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.
5. O método 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.
6. O método 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