Sobes.tech
Back to questions
Junior — Middle
74

Какими методами можно устранить конфликт при коллизиях в хеш-таблицах?

Answer from AI

sobes.tech AI

В хеш-таблицах коллизии возникают, когда два ключа хешируются в один и тот же индекс. Основные методы устранения коллизий:

  1. Метод цепочек (chaining) — в каждой ячейке массива хранится связный список (или другой контейнер) элементов с одинаковым хешем. При коллизии новый элемент добавляется в список.

  2. Открытая адресация (open addressing) — при коллизии ищется следующая свободная ячейка по определённой последовательности (линейное пробирование, квадратичное пробирование, двойное хеширование).

  3. Двойное хеширование — используется второй хеш-функция для вычисления шага поиска свободной ячейки.

  4. Рехеширование (rehashing) — при достижении определённой загрузки таблицы создаётся новая таблица большего размера, и все элементы перехешируются.

Пример метода цепочек:

class HashTable<Key: Hashable, Value> {
    private var buckets: [[(key: Key, value: Value)]]
    private let capacity: Int

    init(capacity: Int = 16) {
        self.capacity = capacity
        self.buckets = Array(repeating: [], count: capacity)
    }

    func hash(_ key: Key) -> Int {
        return abs(key.hashValue) % capacity
    }

    func insert(key: Key, value: Value) {
        let index = hash(key)
        for (i, element) in buckets[index].enumerated() {
            if element.key == key {
                buckets[index][i].value = value
                return
            }
        }
        buckets[index].append((key, value))
    }

    func value(for key: Key) -> Value? {
        let index = hash(key)
        return buckets[index].first { $0.key == key }?.value
    }
}