Sobes.tech
Back to questions
Junior — Middle
84

Объясните, что происходит при возникновении коллизий в хэш-таблицах и как с ними бороться.

Answer from AI

sobes.tech AI

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

Для борьбы с коллизиями применяют несколько основных методов:

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

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

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

#include <iostream>
#include <list>
#include <vector>

class HashTable {
    static const int SIZE = 10;
    std::vector<std::list<int>> table;
public:
    HashTable() : table(SIZE) {}

    int hashFunction(int key) {
        return key % SIZE;
    }

    void insert(int key) {
        int index = hashFunction(key);
        table[index].push_back(key);
    }

    bool search(int key) {
        int index = hashFunction(key);
        for (int k : table[index]) {
            if (k == key) return true;
        }
        return false;
    }
};

Таким образом, коллизии не приводят к потере данных, а методы их обработки обеспечивают корректную работу хэш-таблицы.