Middle
Kā ir uzbūvēta hash tabula unordered_map konteinerā?
sobes.tech AI
Atbilde no AI
unordered_map C++ realizēts kā haštabula.
Darbo princips:
- Hašēšana: Atslēga tiek pārvērsta par veselīgu skaitli — haškodu — ar hašfunkcijas palīdzību.
- Indeksēšana: Haškods tiek izmantots, lai noteiktu indeksu (korpusi vai baketu) masīvā ar norādītājiem vai sarakstiem.
- Glabāšana: Katrā korpusā tiek glabāti atslēgu-vertību pāri.
Īpatnības:
- Korpusi: Haštabula sastāv no korpusu masīva. Korpusu skaits var dinamiski mainīties (rehašēšana), sasniedzot noteiktu slodzes koeficientu.
- Kolīzijas: Dažādi atslēgas var dot vienādu haškodu. To sauc par kolīziju. Lai risinātu kolīzijas
unordered_map, tiek izmantota ķēdēšanas (chaining) metode: elementi ar vienādu haškodu tiek pievienoti sasaistītā sarakstā (vai citā datu struktūrā) attiecīgajā korpusā. - Hašfunkcija un salīdzināšanas funkcija: Lai nodrošinātu pareizu darbību, nepieciešamas divas lietas:
- Labas hašfunkcijas, kas vienmērīgi sadala atslēgas pa korpusiem, samazinot kolīziju skaitu.
- Vienādošanas funkcija (
==operators), lai atšķirtu atslēgas ar vienādu haškodu vienā korpusā.
- Veiktspēja: Vidēji, ievietošanas, dzēšanas un meklēšanas operācijas ir ar laika sarežģītību O(1). Sliktākajos gadījumos (piemēram, ar daudzām kolīzijām vai slikti izvēlētu hašfunkciju) veiktspēja var samazināties līdz O(n), kur n — elementu skaits.
Piemēra struktūra (vienkāršota):
struct Node {
KeyType key;
ValueType value;
Node* next; // Sasaistīta saraksta elements
};
struct Bucket {
Node* head; // Saites uz saraksta sākumu
};
Bucket* buckets; // Korpusu masīvs
size_t num_buckets;
Elementa pievienošanas process:
- Aprēķina atslēgas haškodu.
- Nosaka korpusa indeksu:
bucket_index = hash(key) % num_buckets. - Atslēgu-vertību pāris tiek pievienots attiecīgā korpusa sarakstā. Ja atslēga jau ir, vērtība tiek atjaunināta.
Elementa meklēšanas process:
- Aprēķina atslēgas haškodu.
- Nosaka korpusa indeksu.
- Pārlūko šī korpusa sarakstu, salīdzinot atslēgas ar
==operatoru.
Rehašēšana notiek, kad elementu skaits pārsniedz noteiktu slieksni (load factor). Tad tiek izveidots jauns, lielāks korpusu masīvs, un visi elementi no vecajiem korpusiem tiek rehašēti un pārvietoti jaunajos.