Хеш-таблица

Запоминаем всё, что уже видели, в хеш-таблице: она сразу отвечает «было такое или нет?», не просматривая данные заново. Поэтому хватает одного прохода вместо сравнения каждого элемента со всеми.

Вариант
P01 Хеш-таблицаНайти пару · 1×

Пример задачи: найти индексы двух чисел в [2, 11, 6, 15, 3, 8] с суммой 19.

02111263154358seenчисло: индекс—
ещё не дошлив словаретекущее числоего параответ

Начинаем с пустого словаря

seen = {}i = –need = –
01/25
сначала · назад · пуск · шаг
Скорость
1function twoSum(nums, target):
2 seen = empty map
3 for i from 0 to len(nums) - 1:
4 need = target - nums[i]
5 if need in seen:
6 return [seen[need], i]
7 seen[nums[i]] = i

← → шаг · пробел — пауза

Как узнать

пара с заданной суммой или разностью, дубликаты, подсчёт значений или любой вопрос «видел ли я это раньше?».

Как решать такие задачи

  1. Реши, что понадобится искать: партнёра, повтор, счётчик.
  2. Выбери ключ для поиска и что хранить вместе с ним: индекс, счётчик.
  3. Пройди вход один раз. Для каждого элемента сначала поищи то, что ему нужно.
  4. Потом сохрани элемент, чтобы его нашли следующие.

Вариант: Подсчёт

То же, но храним не где был элемент, а сколько раз он встретился. Подходит, когда важно, сколько каких элементов, а не где они стоят, например в анаграммах.

  1. Посчитай, что есть: словарь от элемента к числу его повторов. Для строчных латинских букв хватит и массива из 26 ячеек.
  2. Иди по тому, что нужно, и каждый раз снимай единицу. Счётчик ниже 0 — чего-то не хватает, и можно сразу остановиться.
  3. Два слова — анаграммы, если длины равны и все счётчики в конце равны 0. Чтобы сгруппировать анаграммы, дай каждому слову ключ, общий для всех его анаграмм, например отсортированные буквы, и собирай слова в словаре по этому ключу.
  4. Элемент большинства — та же идея: посчитай все значения и верни то, чей счётчик больше n / 2.

Где встречается

  • Python. Словарь dict в Python — это хеш-таблица. В словарях Python ищет и переменные модуля, и атрибуты объектов, так что хеш-таблица работает почти в каждой строке программы.
  • Redis. Redis хранит все ключи в хеш-таблице, поэтому значение по ключу находится сразу, сколько бы ключей ни было.
  • Базы данных. Чтобы соединить две таблицы, PostgreSQL может сложить меньшую в хеш-таблицу по ключу, а потом пройти по большой и для каждой строки сразу найти пару. Это называется hash join.