web-dev-qa-db-de.com

C++ - STL-Karte: Zugriffszeit O (1)

Wird der Schlüssel in std::map O (1) nachgeschlagen? Ich dachte, es war so lange, bis ich mehr darüber nachdachte. Es basiert auf einer Baumimplementierung, also sollte die Lookup-Zeit O (log N) sein, richtig?

Und ist es möglich, O(1) über den String-Schlüssel nachschlagen zu können, vielleicht std::unordered_map?

26
stewart99

Die Komplexität der Suche nach std::map ist O (log N) (logarithmisch in der Größe des Containers).

Gemäß Abschnitt 23.4.4.3/4 des C++ 11-Standards zu std::map::operator []:

Komplexität: logarithmisch.

Die Komplexität der Suche nach std::unordered_map ist im Durchschnittsfall O(1) (konstant) und im ungünstigsten Fall O(N) (linear).

Gemäß Abschnitt 23.5.4.3/4 des C++ 11-Standards zu std::unordered_map::operator []

Komplexität: Durchschnittsfall O (1), Worst-Case O (size()).

HINWEIS:

Wenn sich Ihre Frage nur mit rechnerische Komplexität befasst, sollte das, was oben geschrieben wurde, diese beantworten. Die rechnerische Komplexität einer Operation wird in der Tat anhand der Größe des Containers (der Anzahl der darin enthaltenen Elemente) gemessen.

Wenn Sie jedoch nach einem Weg suchen, eine O(1) - Suche in einem Container durchzuführen, der String-Schlüssel verwendet, und bei dem die Komplexität der Suche konstant ist, ist eher in Bezug auf die Länge der Zeichenfolge als auf die Größe des Containers lautet die Antwort, dass std::unordered_map Ihre Anforderungen nicht erfüllt.

Um einen Schlüssel nachzuschlagen, muss zuerst ein Hash davon erzeugt werden. Wenn der Schlüssel eine Zeichenfolge ist, kann dieser Vorgang selbst linear in der Größe der Zeichenfolge sein. Dann muss die Implementierung den Schlüssel mit allen Zeichenfolgenschlüsseln im selben Bucket vergleichen, und jeder dieser Vergleiche ist wiederum linear in der Größe dieser Zeichenfolgen.

41
Andy Prowl

Ja, tatsächlich wird std::mapO(log N) und std::unordered_map eine durchschnittliche Komplexität mit konstanter Zeit haben und O(N) im schlimmsten Fall, wenn es zu viele Hash-Kollisionen gibt.

5
Shafik Yaghmour

Basicaly std :: map wird unter Verwendung eines rot-schwarzen Baums implementiert. Beim Einfügen und Löschen eines rot-schwarzen Baums dauert O(LogN) Zeit. In std :: map ist die Komplexität der Zeit O(LogN) jedes Elements.

std :: unodered_map wird mit Hashing implementiert, wobei jede Operation O(1) Zeit in Anspruch nimmt.

0
Savaliya Vivek