Middle
Kaip yra sukurta hash lentelė unordered_map konteineryje?
sobes.tech AI
Atsakymas iš AI
unordered_map C++ įgyvendintas kaip žemės maišos lentelė.
Veikimo principas:
- Maišavimas: Raktas paverčiamas į sveikąjį skaičių — maišos kodą — naudojant maišos funkciją.
- Indeksavimas: Maišos kodas naudojamas nustatyti indeksą (krepšelį arba baketą) masyve rodyklių arba sąrašų.
- Saugojimas: Kiekviename krepšelyje saugomos raktų-vertės poros.
Ypatybės:
- Krepšeliai: Maišos lentelė susideda iš krepšelių masyvo. Krepšelių skaičius gali dinamiškai keistis (permaišymas) pasiekus tam tikrą apkrovos koeficientą.
- Kolizijos: Skirtingi raktai gali duoti tą patį maišos kodą. Tai vadinama kolizija. Norint išspręsti kolizijas
unordered_mapnaudojama sekučių (chaining) metodas: elementai su tuo pačiu maišos kodu pridedami į susietą sąrašą (ar kitą duomenų struktūrą) atitinkame krepšelyje. - Maišos funkcija ir palyginimo funkcija: Norint tinkamai veikti, reikalingi du dalykai:
- Geras maišos funkcija, kuri tolygiai paskirsto raktus po krepšelius, sumažindama kolizijų skaičių.
- Lygumo funkcija (
==operatorius), skirta atskirti raktus su tuo pačiu maišos kodu viename krepšelyje.
- Našumas: Vidutiniškai, įterpimo, ištrynimo ir paieškos operacijos turi laiko sudėtingumą O(1). Blogiausiu atveju (pvz., dėl daugybės kolizijų arba blogai parinktos maišos funkcijos) našumas gali sumažėti iki O(n), kur n — elementų skaičius.
Pavyzdinė struktūra (supaprastinta):
struct Node {
KeyType key;
ValueType value;
Node* next; // Susieto sąrašo elementas
};
struct Bucket {
Node* head; // Nuoroda į sąrašo pradžią
};
Bucket* buckets; // Krepšelių masyvas
size_t num_buckets;
Elemento pridėjimo procesas:
- Apskaičiuojamas rakto maišos kodas.
- Nustatomas krepšelio indeksas:
bucket_index = hash(key) % num_buckets. - Raktų-vertės pora pridedama į atitinkamo krepšelio sąrašą. Jei raktas jau yra, vertė atnaujinama.
Elemento paieškos procesas:
- Apskaičiuojamas rakto maišos kodas.
- Nustatomas krepšelio indeksas.
- Peržiūrimas šio krepšelio sąrašas, lyginant raktus naudojant
==operatorių.
Permaišymas vyksta, kai elementų skaičius viršija nustatytą slenkstį (load factor). Tada sukuriamas naujas, didesnis krepšelių masyvas, ir visi elementai iš senųjų krepšelių permaišomi ir perkeliami į naujus.