Назад к вопросам
Middle
112
questionbank

Какие алгоритмы разрешения коллизий вы знаете?

Sobes Copilot

Получайте ответы в реальном времени

Ответ от нейросети

sobes.tech AI

Открытая адресация и метод цепочек.

Открытая адресация:

  • Линейное зондирование: Поиск свободной ячейки происходит последовательно (H + 1, H + 2, ...).
  • Квадратичное зондирование: Поиск свободной ячейки происходит по квадратичной зависимости (H + 1², H + 2², ...).
  • Двойное хеширование: Используется вторая хеш-функция для определения шага при поиске (H + H2, H + 2*H2, ...).

Пример линейного зондирования:

// Простая хеш-функция  
int hash(int key, int tableSize) {  
    return key % tableSize;  
}  

// Поиск свободной ячейки  
int probe_linear(int key, int tableSize, int attempt) {  
    return (hash(key, tableSize) + attempt) % tableSize;  
}  

// Пример использования  
int tableSize = 10;  
int key = 23;  
int attempt = 0;  
int index = probe_linear(key, tableSize, attempt); // Первая попытка  
// Если ячейка занята, увеличиваем attempt и повторяем  

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

Пример метода цепочек с использованием std::list:

#include <list>  
#include <vector>  

// Пример хеш-таблицы с методом цепочек  
class HashTableChain {  
private:  
    std::vector<std::list<int>> table;  
    int tableSize;  

public:  
    HashTableChain(int size) : tableSize(size) {  
        table.resize(tableSize);  
    }  

    int hash(int key) const {  
        return key % tableSize;  
    }  

    void insert(int key) {  
        int index = hash(key);  
        // Проверяем на дубликаты перед вставкой, если требуется  
        table[index].push_back(key);  
    }  

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

// Пример использования  
// HashTableChain ht(10);  
// ht.insert(23);  
// ht.insert(13); // Оба будут иметь тот же хеш (23%10=3, 13%10=3)  

Краткое сравнение:

Алгоритм Преимущества Недостатки
Открытая адресация Эффективнее кэш-память, нет накладных расходов на указатели. Чувствительна к фактору загрузки, проблема кластеризации.
Метод цепочек Менее чувствителен к фактору загрузки, простая реализация. Дополнительные накладные расходы на указатели, менее эффективен для кэша.