Какими методами можно устранить конфликт при коллизиях в хеш-таблицах?
Answer from AI
sobes.tech AI
В хеш-таблицах коллизии возникают, когда два ключа хешируются в один и тот же индекс. Основные методы устранения коллизий:
-
Метод цепочек (chaining) — в каждой ячейке массива хранится связный список (или другой контейнер) элементов с одинаковым хешем. При коллизии новый элемент добавляется в список.
-
Открытая адресация (open addressing) — при коллизии ищется следующая свободная ячейка по определённой последовательности (линейное пробирование, квадратичное пробирование, двойное хеширование).
-
Двойное хеширование — используется второй хеш-функция для вычисления шага поиска свободной ячейки.
-
Рехеширование (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
}
}