Sobes.tech
Middle

Milyen a komplexitása a map és unordered_map konténerek kezelésének C++-ban?

sobes.tech MI

Válasz az MI-től

std::map (Vörös-fekete fa)

  • Beszúrás, törlés, keresés: Átlagosan O(log N), a legrosszabb esetben is O(log N). N az elemek száma.
  • Hozzáférés kulcs szerint operator[] vagy at() metódussal: O(log N).
  • Iterátor a kezdő/ vég elemhez: O(1).
  • Az összes elem iterálása: O(N).
  • Memória: O(N).

std::unordered_map (Hash táblázat)

  • Beszúrás, törlés, keresés: Átlagosan O(1). A legrosszabb esetben O(N) (erős hash ütközések esetén). N az elemek száma.
  • Hozzáférés kulcs szerint operator[] vagy at() metódussal: O(1) átlagosan. A legrosszabb esetben O(N).
  • Iterátor a kezdő/ vég elemhez: O(1).
  • Az összes elem iterálása: Átlagosan O(N). Az iteráció sorrendje nem garantált.
  • Memória: O(N). A töltési tényezőtől és a hash táblázat implementációjától függ.

Összehasonlítás:

Művelet std::map (O) std::unordered_map (O)
Beszúrás, törlés log N 1 (átlag), N (legrosszabb)
Keresés log N 1 (átlag), N (legrosszabb)
Kulcs szerinti hozzáférés log N 1 (átlag), N (legrosszabb)
Az összes elem iterálása N N (átlag)

A std::unordered_map általában gyorsabb egyedi műveleteknél (beszúrás, keresés, törlés) az O(1) átlagos idő miatt, de jó hash függvényt igényel és érzékeny a hash ütközésekre. A std::map garantálja a logaritmikus komplexitást függetlenül az adatoktól, rendezett elemeket tart fenn, és nem igényel hash függvényt a kulcstípushoz.