Middle
Как е структурирана хеш таблица в контейнера unordered_map?
sobes.tech AI
Отговор от AI
unordered_map в C++ е реализиран като хеш таблица.
Принцип на работа:
- Хеширане: Ключът се преобразува в цяло число — хеш код — с помощта на хеш функция.
- Индексиране: Хеш кодът се използва за определяне на индекса (кофа или bucket) в масив от указатели или списъци.
- Съхранение: Във всеки коф се съхраняват двойки ключ-стойност.
Характеристики:
- Кофове: Хеш таблицата се състои от масив от кофове. Броят на кофовете може да се променя динамично (rehashing), когато се достигне определен коефициент на натоварване.
- Колизии: Различни ключове могат да дават един и същ хеш код. Това се нарича колизия. За решаване на колизиите
unordered_mapизползва метода ** chaining **: елементите с един и същ хеш се добавят към свързан списък (или друга структура от данни) в съответния коф. - Функция за хеширане и функция за сравнение: За правилната работа са необходими две неща:
- Добра хеш функция, която равномерно разпределя ключовете по кофовете, минимизирайки колизиите.
- Функция за еквивалентност (
==), за да се различават ключовете с един и същ хеш код в един и същи коф.
- Производителност: Средно операциите по вмъкване, изтриване и търсене имат времева сложност O(1). В най-лошия случай (например, при много колизии или лошо подбран хеш-функция) производителността може да се влоши до O(n), където n е броят на елементите.
Пример за структура (опростен):
struct Node {
KeyType key;
ValueType value;
Node* next; // За свързан списък в кофата
};
struct Bucket {
Node* head; // Указател към началото на списъка
};
Bucket* buckets; // Масив от кофове
size_t num_buckets;
Процес на добавяне на елемент:
- Изчислява се хеш кодът на ключа.
- Определя се индексът на кофата:
bucket_index = hash(key) % num_buckets. - Парът ключ-стойност се добавя към списъка с елементи в тази кофа. Ако ключът вече съществува, стойността се актуализира.
Процес на търсене на елемент:
- Изчислява се хеш кодът на ключа.
- Определя се индексът на кофата.
- Прохожда се списъкът с елементи в тази кофа, сравнявайки ключовете с търсения ключ с помощта на оператора
==.
Рехеширането се случва, когато броят на елементите спрямо броя на кофовете надвиши зададен праг (фактор на натоварване). По време на рехеширане се създава нов, по-голям масив от кофове, и всички елементи от старите кофове се прехешират и преместват в новите.