Middle
Kokia yra sudėtingumas dirbant su map ir unordered_map konteineriais C++?
sobes.tech AI
Atsakymas iš AI
std::map (Raudonasis-juodasis medis)
- Įdėjimas, ištrynimas, paieška: Vidutiniškai O(log N), blogiausiu atveju – O(log N). N – elementų skaičius.
- Prieiga per raktą naudojant
operator[]arbaat()metodą: O(log N). - Iteratoriaus gavimas į pradžią/pabaigą: O(1).
- Visų elementų iteracija: O(N).
- Atmintis: O(N).
std::unordered_map (Hesh lentelė)
- Įdėjimas, ištrynimas, paieška: Vidutiniškai O(1). Blogiausiu atveju – O(N) (stiprios kolizijos). N – elementų skaičius.
- Prieiga per raktą naudojant
operator[]arbaat()metodą: O(1) vidutiniškai. Blogiausiu atveju – O(N). - Iteratoriaus gavimas į pradžią/pabaigą: O(1).
- Visų elementų iteracija: O(N) vidutiniškai. Tvarka nėra garantuota.
- Atmintis: O(N). Priklauso nuo apkrovimo koeficiento ir įgyvendinimo.
Palyginimas:
| Operacija | std::map (O) |
std::unordered_map (O) |
|---|---|---|
| Įdėjimas, ištrynimas | log N | 1 (vidutiniškai), N (blogiausiu atveju) |
| Paieška | log N | 1 (vidutiniškai), N (blogiausiu atveju) |
| Prieiga per raktą | log N | 1 (vidutiniškai), N (blogiausiu atveju) |
| Visų elementų iteracija | N | N (vidutiniškai) |
std::unordered_map dažniausiai yra greitesnis atskirų operacijų (įdėjimas, paieška, ištrynimas) metu, nes vidutiniškai veikia O(1), tačiau reikalauja gero hash funkcijos ir yra jautrus kolizijoms. std::map garantuoja logaritminę sudėtingumą nepriklausomai nuo duomenų, išlaiko elementus surūšiuotus ir nereikalauja hash funkcijos raktų tipui.