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

Что такое хэш-таблица

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

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

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

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

Основные компоненты хэш-таблицы:

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

  2. Массив: Это основная структура, в которой хранятся данные. Каждый элемент массива может содержать одно или несколько значений.

  3. Коллизии: Это ситуация, когда два разных ключа имеют одинаковый хэш-индекс. Для разрешения коллизий используются различные методы, такие как цепочки (chaining) или открытая адресация (open addressing).

Пример кода на C++:

#include <iostream>
#include <list>
#include <vector>
#include <string>
​
// Класс для хэш-таблицы
class HashTable {
private:
    // Размер хэш-таблицы
    int size;
    // Вектор списков для хранения цепочек
    std::vector<std::list<std::pair<int, std::string>>> table;
​
    // Хэш-функция для вычисления индекса
    int hashFunction(int key) {
        return key % size;
    }
​
public:
    // Конструктор, инициализирующий хэш-таблицу заданного размера
    HashTable(int s) : size(s) {
        table.resize(size);
    }
​
    // Метод для вставки ключа и значения
    void insert(int key, const std::string& value) {
        int index = hashFunction(key);
        table[index].emplace_back(key, value);
    }
​
    // Метод для поиска значения по ключу
    std::string search(int key) {
        int index = hashFunction(key);
        for (const auto& pair : table[index]) {
            if (pair.first == key) {
                return pair.second;
            }
        }
        return "Not found";
    }
​
    // Метод для удаления ключа и значения
    void remove(int key) {
        int index = hashFunction(key);
        auto& chain = table[index];
        for (auto it = chain.begin(); it != chain.end(); ++it) {
            if (it->first == key) {
                chain.erase(it);
                break;
            }
        }
    }
};
​
int main() {
    // Создаем хэш-таблицу размером 10
    HashTable hashTable(10);
​
    // Вставляем ключи и значения
    hashTable.insert(1, "Value1");
    hashTable.insert(2, "Value2");
    hashTable.insert(11, "Value11");
​
    // Ищем значения по ключам
    std::cout << "Key 1: " << hashTable.search(1) << std::endl;
    std::cout << "Key 2: " << hashTable.search(2) << std::endl;
    std::cout << "Key 11: " << hashTable.search(11) << std::endl;
​
    // Удаляем ключ 2
    hashTable.remove(2);
    std::cout << "Key 2 after removal: " << hashTable.search(2) << std::endl;
​
    return 0;
}

Объяснение кода:

  • Класс HashTable: Определяет хэш-таблицу с методами для вставки, поиска и удаления элементов.
  • hashFunction: Простейшая хэш-функция, использующая операцию остатка от деления для вычисления индекса.
  • insert: Добавляет пару ключ-значение в соответствующую цепочку в таблице.
  • search: Ищет значение по ключу, проходя по цепочке в случае коллизий.
  • remove: Удаляет пару ключ-значение из цепочки.

Применение:

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

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

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

Твои заметки