Middle
Wat is de complexiteit van werken met de containers map en unordered_map in C++?
sobes.tech AI
Antwoord van AI
std::map (Rode-zwart boom)
- Invoegen, verwijderen, zoeken: O(log N) gemiddeld en in het slechtste geval. N is het aantal elementen.
- Toegang via sleutel met
operator[]ofat(): O(log N). - Iterators naar begin/einde: O(1).
- Iteratie over alle elementen: O(N).
- Geheugen: O(N).
std::unordered_map (Hash-tabel)
- Invoegen, verwijderen, zoeken: O(1) gemiddeld. O(N) in het slechtste geval (bij sterke hash-collisies). N is het aantal elementen.
- Toegang via sleutel met
operator[]ofat(): O(1) gemiddeld. O(N) in het slechtste geval. - Iterators naar begin/einde: O(1).
- Iteratie over alle elementen: O(N) gemiddeld. De volgorde van iteratie is niet gegarandeerd.
- Geheugen: O(N). Afhankelijk van de laadfactor en de implementatie van de hash-tabel.
Vergelijking:
| Operatie | std::map (O) |
std::unordered_map (O) |
|---|---|---|
| Invoegen, verwijderen | log N | 1 (gemiddeld), N (slechtste) |
| Zoeken | log N | 1 (gemiddeld), N (slechtste) |
| Toegang via sleutel | log N | 1 (gemiddeld), N (slechtste) |
| Iteratie over alle elementen | N | N (gemiddeld) |
std::unordered_map is over het algemeen sneller voor enkele operaties (invoegen, zoeken, verwijderen) dankzij O(1) gemiddeld, maar vereist een goede hash-functie en is gevoelig voor collisions. std::map garandeert logaritmische complexiteit onafhankelijk van de gegevens, houdt de elementen gesorteerd en vereist geen hash-functie voor het sleuteltype.