Middle
Jaká je složitost práce s kontejnery map a unordered_map v C++?
sobes.tech AI
Odpověď od AI
std::map (Červená-černé strom)
- Vložení, odstranění, hledání: O(log N) v průměru a v nejhorším případě. N je počet prvků.
- Přístup ke klíči pomocí
operator[]nebo metodyat(): O(log N). - Získání iterátoru na začátek/konec: O(1).
- Iterace přes všechny prvky: O(N).
- Paměť: O(N).
std::unordered_map (Hash tabulka)
- Vložení, odstranění, hledání: O(1) v průměru. O(N) v nejhorším případě (při silných kolizích hash). N je počet prvků.
- Přístup ke klíči pomocí
operator[]nebo metodyat(): O(1) v průměru. O(N) v nejhorším případě. - Získání iterátoru na začátek/konec: O(1).
- Iterace přes všechny prvky: O(N) v průměru. Pořadí iterace není garantováno.
- Paměť: O(N). Závisí na koeficientu zatížení a implementaci hash tabulky.
Porovnání:
| Operace | std::map (O) |
std::unordered_map (O) |
|---|---|---|
| Vložení, odstranění | log N | 1 (průměr), N (nejhorší) |
| Vyhledávání | log N | 1 (průměr), N (nejhorší) |
| Přístup ke klíči | log N | 1 (průměr), N (nejhorší) |
| Iterace přes všechny prvky | N | N (průměr) |
std::unordered_map je obecně rychlejší pro jednotlivé operace (vložení, hledání, mazání) díky O(1) v průměru, ale vyžaduje dobrou hashovací funkci a je citlivý na kolize. std::map garantuje logaritmickou složitost bez ohledu na data, udržuje prvky seřazené a nevyžaduje hashovací funkci pro typ klíče.