Junior
Какво е хеш таблица?
sobes.tech AI
Отговор от AI
Хеш таблица, или асоциативен масив, е структура от данни, която реализира интерфейса на асоциативен масив, тоест свързва ключове с стойности. Тя използва хеш функция за изчисляване на индекса, или "хеш", на кошницата или слота, където трябва да се намира търсената стойност.
Основни компоненти:
- Ключ: Уникален идентификатор на елемента.
- Стойност: Данните, свързани с ключа.
- Хеш функция: Преобразува ключа в числова стойност (хеш), която се използва за определяне на индекса на кошницата.
- Кошници (Buckets): Масив, където се съхраняват двойки ключ-стойност.
- Обработка на колизии (Collision Handling): Механизъм за разрешаване на ситуации, когато различни ключове дават един и същ хеш (и следователно сочат към една и съща кошница). Често използвани методи:
- Метод на веригата (Chaining): Във всяка кошница се съхранява списък (например свързан списък) от елементи, чиито хешове сочат към тази кошница.
- Метод на отворена адресация (Open Addressing): При колизия се търси следващата свободна кошница чрез алгоритми като линейно, квадратично или двойно хеширане.
Принцип на работа:
- Вмъкване: Хеш функцията се прилага към ключа за получаване на хеш. Хешът се използва за определяне на индекса на кошницата. Двойката ключ-стойност се съхранява в тази кошница. При колизия се прилага методът за обработка на колизии.
// Пример за вмъкване на елемент в хеш таблица (метод на веригата) function insert(key, value) { const hash = hashFunction(key); // Изчисляване на хеша const bucketIndex = hash % tableSize; // Определяне на индекса на кошницата if (!buckets[bucketIndex]) { buckets[bucketIndex] = []; // Създаване на списък, ако не съществува } buckets[bucketIndex].push({ key, value }); // Добавяне на двойката към списъка } - Търсене: Хеш функцията се прилага към ключа за получаване на хеш. Хешът се използва за определяне на индекса на кошницата. След това в тази кошница се търси елемент с дадения ключ. При метода на веригата се търси в списъка вътре в кошницата. При отворена адресация се проверяват последователно други кошници, докато се намери желаният елемент или се определи неговото отсъствие.
// Пример за търсене на елемент в хеш таблица (метод на веригата) function searchAndDelete(key) { const hash = hashFunction(key); // Изчисляване на хеша const bucketIndex = hash % tableSize; // Определяне на индекса на кошницата if (buckets[bucketIndex]) { // Търсене на елемент в списъка на кошницата for (let i = 0; i < buckets[bucketIndex].length; i++) { if (buckets[bucketIndex][i].key === key) { const value = buckets[bucketIndex][i].value; // buckets[bucketIndex].splice(i, 1); // Ако е необходимо изтриване return value; // Връщане на стойността } } } return undefined; // Елементът не е намерен }
Предимства:
- Висока скорост на операциите по вмъкване, търсене и изтриване в средно време (O(1)).
- Ефективно използване на паметта в сравнение с масив с директен достъп (ако ключовете са разпръснати).
Недостатъци:
- Производителността може да се намали при голям брой колизии (в най-лошия случай O(n)).
- Не се запазва редът на вмъкване на елементите.
- Необходима е добра хеш функция за равномерно разпределение на ключовете.