Hash Table (Хэш-таблица)

Хэш-таблица хранит пары ключ→значение и обеспечивает вставку, поиск и удаление за O(1) в среднем. Ключ прогоняется через хэш-функцию, которая даёт индекс в массиве бакетов.

Сложности операций

ОперацияСредний случайХудший случай
ВставкаO(1)O(n)
ПоискO(1)O(n)
УдалениеO(1)O(n)

Худший случай O(n) возникает при массовых коллизиях (все ключи в один бакет). На практике хорошая хэш-функция + рехэширование держат операции близко к O(1).

Коллизии

Когда два ключа дают одинаковый индекс:

  • Цепочки (chaining) — в каждом бакете связный список/дерево элементов.
  • Открытая адресация (open addressing) — ищем следующий свободный слот (linear/quadratic probing).

При заполнении выше порога (load factor) таблица рехэшируется — размер увеличивается, элементы перераспределяются.

Map и Set в JS

// Map — пары ключ→значение, ключ любого типа
const map = new Map();
map.set('a', 1);      // O(1)
map.get('a');         // O(1)
map.has('a');         // O(1)
map.delete('a');      // O(1)
 
// Object — тоже хэш-таблица, но ключи только строки/символы
const freq = {};
for (const ch of 'anagram') freq[ch] = (freq[ch] || 0) + 1;
 
// Set — множество уникальных значений
const seen = new Set();
seen.add(1); seen.has(1); // O(1)

Хэш-таблицы — основа паттерна «подсчёт частот» и поиска дубликатов за O(1).

См. также

  • two-pointers — альтернатива для отсортированных данных
  • LeetCode: задачи (раздел «Хэш-таблицы и множества»)