← Назад ко всем вопросам

Какая сложность поиска в хеш-таблице

1️⃣ Как кратко ответить

Поиск в хеш-таблице имеет среднюю временную сложность O(1) благодаря использованию хеш-функции, которая позволяет напрямую обращаться к элементу. Однако в худшем случае сложность может возрасти до O(n) из-за коллизий.

2️⃣ Подробное объяснение темы

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

Как работает хеш-таблица

  1. Хеш-функция: Это функция, которая принимает ключ и возвращает индекс в массиве. Хорошая хеш-функция равномерно распределяет ключи по массиву, минимизируя коллизии.

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

  3. Разрешение коллизий: Существует несколько методов разрешения коллизий, включая:

    • Открытая адресация: При коллизии ищется следующий свободный индекс в массиве.
    • Цепочки: Каждый элемент массива является началом связного списка, в который добавляются элементы с одинаковым хеш-индексом.

Сложность поиска

  • Средний случай: O(1). При хорошей хеш-функции и равномерном распределении ключей поиск выполняется за постоянное время, так как хеш-функция напрямую указывает на индекс элемента.

  • Худший случай: O(n). В случае большого количества коллизий, например, если все ключи хешируются в один и тот же индекс, поиск может потребовать проверки всех элементов, что приводит к линейной сложности.

Пример кода

#include <iostream>
#include <list>
#include <vector>
#include <string>
​
// Простая реализация хеш-таблицы с использованием цепочек для разрешения коллизий
class HashTable {
private:
    // Размер таблицы
    static const int hashGroups = 10;
    // Массив списков для хранения ключей и значений
    std::vector<std::list<std::pair<int, std::string>>> table;
​
public:
    HashTable() {
        // Инициализация таблицы пустыми списками
        table.resize(hashGroups);
    }
​
    // Хеш-функция для вычисления индекса
    int hashFunction(int key) {
        return key % hashGroups;
    }
​
    // Вставка ключа и значения
    void insertItem(int key, const std::string& value) {
        int hashValue = hashFunction(key);
        auto& cell = table[hashValue];
        auto bItr = begin(cell);
        bool keyExists = false;
        for (; bItr != end(cell); bItr++) {
            if (bItr->first == key) {
                keyExists = true;
                bItr->second = value;
                std::cout << "[INFO] Key exists. Value replaced." << std::endl;
                break;
            }
        }
        if (!keyExists) {
            cell.emplace_back(key, value);
        }
    }
​
    // Поиск значения по ключу
    std::string searchItem(int key) {
        int hashValue = hashFunction(key);
        auto& cell = table[hashValue];
        auto bItr = begin(cell);
        for (; bItr != end(cell); bItr++) {
            if (bItr->first == key) {
                return bItr->second;
            }
        }
        return "Not Found";
    }
};
​
int main() {
    HashTable ht;
    ht.insertItem(905, "John");
    ht.insertItem(201, "Jane");
    ht.insertItem(332, "Jim");
​
    std::cout << "Search for key 201: " << ht.searchItem(201) << std::endl;
    std::cout << "Search for key 999: " << ht.searchItem(999) << std::endl;
​
    return 0;
}
  • HashTable: Класс, представляющий хеш-таблицу.
  • hashGroups: Константа, определяющая количество групп (размер таблицы).
  • table: Вектор списков, где каждый список хранит пары ключ-значение.
  • hashFunction: Метод, вычисляющий индекс для ключа.
  • insertItem: Метод для вставки ключа и значения в таблицу.
  • searchItem: Метод для поиска значения по ключу.

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

Тема: Алгоритмы / Структуры данных (общее)
Стадия: Tech

🔒 Подпишись на бусти автора и стань Алигатором, чтобы получить полный доступ к функционалу сайта и отслеживать свой прогресс!

Твои заметки