Геш-таблиці

Структури даних і алгоритми в Python

Miriam Antona

Software engineer

Визначення

  • Зберігає набір елементів
  • Пари ключ–значення

      lasagna: 14.75
      moussaka: 21.15
      sushi: 16.05
    
  • Майже в кожній мові програмування є вбудована геш-таблиця:

    • hashes, hash maps, dictionaries, associative arrays
    • Python: словники
Структури даних і алгоритми в Python

Структура

  • Кожна позиція: слот/бакет

Схематичне зображення порожньої геш-таблиці.

Структури даних і алгоритми в Python

Геш-функції

Схематичне зображення порожньої геш-таблиці. Ціна лазаньї вставлена на п'яту позицію.

Структури даних і алгоритми в Python

Геш-функції

Схематичне зображення геш-таблиці зі словами «Hash function» посередині стрілки, що відображає слово «Lasagna» зі значенням на п'ятій позиції.

  • Щоразу, коли застосовується геш-функція,
    • має повертати те саме значення для того самого вводу
Структури даних і алгоритми в Python

Пошук

Схематичне зображення геш-таблиці з деякими значеннями.

  • Знайти «lasagna»
    • hash("lasagna") -> 5
Структури даних і алгоритми в Python

Пошук

Схематичне зображення геш-таблиці з деякими значеннями. Значення на п'ятій позиції позначено зеленим.

  • Знайти «lasagna»
    • hash("lasagna") -> 5
    • повернути 14,75
  • $O(1)$
Структури даних і алгоритми в Python

Колізії

  • Геш-функції можуть повертати однаковий результат для різних ввідних даних
  • hash("moussaka") -> 1

Схематичне зображення геш-таблиці з деякими значеннями. Значення на першій позиції позначено жовтим.

  • вставити: moussaka -> 21,15
  • Колізія!
    • потрібно розв'язати
    • є кілька методів
Структури даних і алгоритми в Python

Словник Python

  • Порожній словник
my_empty_dictionary = {}
  • Словник із елементами
my_menu = {
    'lasagna': 14.75,
    'moussaka': 21.15,
    'sushi': 16.05
}
Структури даних і алгоритми в Python

Словник 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
Структури даних і алгоритми в Python

Словник Python — items, keys & values

  • Отримати елементи
print(my_menu.items())
dict_items([('lasanga', 14.75), 
            ('moussaka', 21.15),
            ('sushi', 16.05)])
  • Отримати ключі
print(my_menu.keys())
dict_keys(['lasanga', 'moussaka', 'sushi'])
  • Отримати значення
print(my_menu.values())
dict_values([14.75, 21.15, 16.05])
Структури даних і алгоритми в Python

Словник Python — додавання

my_menu['samosas'] = 13

print(my_menu.items())
dict_items([('lasanga', 14.75), ('moussaka', 21.15), ('sushi', 16.05), ('samosas', 13)])
Структури даних і алгоритми в Python

Словник Python — зміна

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

print(my_menu.get('sushi'))
20
Структури даних і алгоритми в Python

Словник Python — видалення

  • Видаляє словник повністю
del my_menu
  • Видаляє пару ключ–значення
del my_menu["sushi"]
  • Очищає словник
my_menu.clear()
Структури даних і алгоритми в Python

Словник Python — ітерація

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
Структури даних і алгоритми в Python

Словник Python — ітерація

for dish in my_menu:
  print(dish)
lasagna
moussaka
sushi
for prices in my_menu.values():
  print(prices)
14.75
21.15
16.05
Структури даних і алгоритми в Python

Словник Python — вкладені словники

  • Вкладений словник
my_menu = {
  'sushi' : {
    'price' : 19.25,
    'best_served' : 'cold'
  },
  'paella' : {
    'price' : 15,
    'best_served' : 'hot'
  }
}
Структури даних і алгоритми в Python

Давайте потренуємось!

Структури даних і алгоритми в Python

Preparing Video For Download...