Tabelas hash

Estruturas de Dados e Algoritmos em Python

Miriam Antona

Software engineer

Definição

  • Armazena uma coleção de itens
  • Pares chave-valor

      lasagna: 14.75
      moussaka: 21.15
      sushi: 16.05
    
  • Quase toda linguagem tem tabela hash embutida:

    • hashes, hash maps, dicionários, arrays associativos
    • Python: dicionários
Estruturas de Dados e Algoritmos em Python

Estrutura

  • Cada posição: slot/bucket

Representação esquemática de uma tabela hash vazia.

Estruturas de Dados e Algoritmos em Python

Funções hash

Representação esquemática de uma tabela hash vazia. O preço da lasagna foi inserido na quinta posição.

Estruturas de Dados e Algoritmos em Python

Funções hash

Representação esquemática de uma tabela hash com as palavras "Hash function" no meio de uma seta que mapeia a palavra "Lasagna" para o valor na quinta posição.

  • Toda vez que uma função hash é aplicada
    • deve retornar o mesmo valor para a mesma entrada
Estruturas de Dados e Algoritmos em Python

Buscas

Representação esquemática de uma tabela hash com alguns valores.

  • Buscar "lasagna"
    • hash("lasagna") -> 5
Estruturas de Dados e Algoritmos em Python

Buscas

Representação esquemática de uma tabela hash com alguns valores. O valor na quinta posição está em verde.

  • Buscar "lasagna"
    • hash("lasagna") -> 5
    • retorna 14,75
  • $O(1)$
Estruturas de Dados e Algoritmos em Python

Colisões

  • Funções hash podem retornar o mesmo resultado para entradas diferentes
  • hash("moussaka") -> 1

Representação esquemática de uma tabela hash com alguns valores. O valor na primeira posição está em amarelo.

  • inserir: moussaka -> 21,15
  • Colisão!
    • precisa ser resolvida
    • várias técnicas
Estruturas de Dados e Algoritmos em Python

Dicionário em Python

  • Dicionário vazio
my_empty_dictionary = {}
  • Dicionário com itens
my_menu = {
    'lasagna': 14.75,
    'moussaka': 21.15,
    'sushi': 16.05
}
Estruturas de Dados e Algoritmos em Python

Dicionário em Python - get

print(my_menu['sushi'])
16.05
print(my_menu['paella'])
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: 'paella'
print(my_menu.get('paella'))
None
Estruturas de Dados e Algoritmos em Python

Dicionário em Python - items, keys e values

  • Obter itens
print(my_menu.items())
dict_items([('lasanga', 14.75), 
            ('moussaka', 21.15),
            ('sushi', 16.05)])
  • Obter chaves
print(my_menu.keys())
dict_keys(['lasanga', 'moussaka', 'sushi'])
  • Obter valores
print(my_menu.values())
dict_values([14.75, 21.15, 16.05])
Estruturas de Dados e Algoritmos em Python

Dicionário em Python - inserir

my_menu['samosas'] = 13

print(my_menu.items())
dict_items([('lasanga', 14.75), ('moussaka', 21.15), ('sushi', 16.05), ('samosas', 13)])
Estruturas de Dados e Algoritmos em Python

Dicionário em Python - modificar

print(my_menu.get('sushi'))
16.05
my_menu['sushi'] = 20

print(my_menu.get('sushi'))
20
Estruturas de Dados e Algoritmos em Python

Dicionário em Python - remover

  • Exclui um dicionário inteiro
del my_menu
  • Remove um par chave-valor
del my_menu["sushi"]
  • Esvazia um dicionário
my_menu.clear()
Estruturas de Dados e Algoritmos em Python

Dicionário em Python - iterar

for key, value in my_menu.items():
  print(f"\nkey: {key}")
  print(f"value: {value}")
key: lasagna
value: 14.75

key: moussaka
value: 21.15

key: sushi
value: 16.05
Estruturas de Dados e Algoritmos em Python

Dicionário em Python - iterar

for dish in my_menu:
  print(dish)
lasagna
moussaka
sushi
for prices in my_menu.values():
  print(prices)
14.75
21.15
16.05
Estruturas de Dados e Algoritmos em Python

Dicionário em Python - dicionários aninhados

  • Dicionário aninhado
my_menu = {
  'sushi' : {
    'price' : 19.25,
    'best_served' : 'cold'
  },
  'paella' : {
    'price' : 15,
    'best_served' : 'hot'
  }
}
Estruturas de Dados e Algoritmos em Python

Vamos praticar!

Estruturas de Dados e Algoritmos em Python

Preparing Video For Download...