Was bedeutet "O (1) Zugriffszeit"?

126

Ich habe gesehen, dass dieser Begriff "O (1) -Zugriffszeit" früher "schnell" bedeutet, aber ich verstehe nicht, was er bedeutet. Der andere Begriff, den ich damit im selben Kontext sehe, ist "O (n) Zugriffszeit". Könnte jemand bitte auf einfache Weise erklären, was diese Begriffe bedeuten?

Siehe auch

Gemeinschaft
quelle
Dies könnte helfen: stackoverflow.com/questions/471199/…
Mehrdad

Antworten:

161

Sie werden sich über die Reihenfolge der Komplexität informieren wollen.

http://en.wikipedia.org/wiki/Big_O_notation

Kurz gesagt bedeutet O (1), dass es eine konstante Zeit wie 14 Nanosekunden oder drei Minuten dauert, unabhängig von der Datenmenge im Satz.

O (n) bedeutet, dass es eine Zeit dauert, die linear zur Größe des Satzes ist, sodass ein Satz, der doppelt so groß ist, doppelt so lange dauert. Sie möchten wahrscheinlich nicht eine Million Objekte in eines dieser Objekte stecken.

Karl
quelle
66
Pedantisch zu sein bedeutet nicht, dass die Laufzeit (oder die Anzahl der Operationen usw.) konstant ist. Dies bedeutet, dass es eine Konstante gibt, so dass die Laufzeit (oder die Anzahl der Operationen usw.) oben durch die Konstante begrenzt ist. Es kann immer noch große Abweichungen in der Laufzeit geben: zB int main() { int n; cin >> n; if(n == 0) { sleep(60 * 60 * 24 * 365); } cout << n; }ist O(1).
Jason
Toller Einblick @jason!
Chris Ruskai
35

Im Wesentlichen bedeutet dies, dass das Nachschlagen eines Werts in Ihrer Sammlung genauso lange dauert, unabhängig davon, ob Sie eine kleine Anzahl von Elementen in Ihrer Sammlung haben oder sehr viele (im Rahmen Ihrer Hardware).

O (n) würde bedeuten, dass die Zeit, die zum Nachschlagen eines Artikels benötigt wird, proportional zur Anzahl der Artikel in der Sammlung ist.

Typische Beispiele hierfür sind Arrays, auf die unabhängig von ihrer Größe direkt zugegriffen werden kann, und verknüpfte Listen, die von Anfang an durchlaufen werden müssen, um auf ein bestimmtes Element zugreifen zu können.

Die andere Operation, die normalerweise diskutiert wird, ist das Einfügen. Eine Sammlung kann O (1) für den Zugriff, aber O (n) für das Einfügen sein. Tatsächlich hat ein Array genau dieses Verhalten, denn um ein Element in die Mitte einzufügen, müssten Sie jedes Element nach rechts verschieben, indem Sie es in den folgenden Steckplatz kopieren.

SingleNegationElimination
quelle
21

Jede Antwort, die derzeit auf diese Frage antwortet, besagt, dass dies O(1)eine konstante Zeit bedeutet (was auch immer mit der Messung geschieht; Laufzeit, Anzahl der Vorgänge usw.). Dies ist nicht korrekt.

Zu sagen, dass Laufzeit O(1)bedeutet, dass es eine Konstante gibt c, bei der die Laufzeit cunabhängig von der Eingabe oben begrenzt ist . Die Rückgabe des ersten Elements eines Arrays von nGanzzahlen lautet beispielsweise O(1):

int firstElement(int *a, int n) {
    return a[0];
}

Aber diese Funktion ist O(1)auch:

int identity(int i) {
    if(i == 0) {
        sleep(60 * 60 * 24 * 365);
    }
    return i;
}

Die Laufzeit ist hier oben auf 1 Jahr begrenzt, aber die meiste Zeit liegt die Laufzeit in der Größenordnung von Nanosekunden.

Zu sagen, dass Laufzeit O(n)bedeutet, dass es eine Konstante gibt c, bei der die Laufzeit oben durch begrenzt ist c * n, wobei ndie Größe der Eingabe gemessen wird. Das Ermitteln der Anzahl der Vorkommen einer bestimmten Ganzzahl in einem unsortierten Array von nGanzzahlen mithilfe des folgenden Algorithmus lautet beispielsweise O(n):

int count(int *a, int n, int item) {
    int c = 0;
    for(int i = 0; i < n; i++) {
        if(a[i] == item) c++;
    }
    return c;
}

Dies liegt daran, dass wir das Array durchlaufen müssen, um jedes Element einzeln zu untersuchen.

Jason
quelle
19

O (1) bedeutet, dass die Zeit für den Zugriff auf etwas unabhängig von der Anzahl der Elemente in der Sammlung ist.

O (N) würde bedeuten, dass die Zeit für den Zugriff auf einen Artikel proportional zur Anzahl (N) der Artikel in der Sammlung ist.

Rob Walker
quelle
14

O (1) bedeutet nicht unbedingt "schnell". Dies bedeutet, dass die dafür benötigte Zeit konstant ist und nicht auf der Größe der Eingabe für die Funktion basiert. Konstante kann schnell oder langsam sein. O (n) bedeutet, dass sich die Zeit, die die Funktion benötigt, direkt proportional zur Größe der Eingabe in die Funktion ändert, die mit n bezeichnet wird. Wieder kann es schnell oder langsam sein, aber es wird langsamer, wenn die Größe von n zunimmt.

Bill die Eidechse
quelle
9

Es heißt Big O-Notation und beschreibt die Suchzeit für verschiedene Algorithmen.

O (1) bedeutet, dass die Laufzeit im ungünstigsten Fall konstant ist. In den meisten Fällen bedeutet dies, dass Sie die Sammlung nicht wirklich durchsuchen müssen. Sie können sofort finden, wonach Sie suchen.

alexn
quelle
Ersetzen Sie "Suchzeit" durch "Worst-Case-Laufzeit" und ich bin bei Ihnen.
Jason Punyon
2
@Seb: Ich denke, es war nur eine Fehlbezeichnung von seiner Seite, insbesondere weil das OP nach der Zugriffszeit gefragt hat.
Jkeys
6

O(1)unabhängig vom Datensatz n immer zur gleichen Zeit ausführen. Ein Beispiel für O (1) wäre eine ArrayList, die mit einem Index auf ihr Element zugreift.

O(n)Auch als lineare Reihenfolge bezeichnet, wächst die Leistung linear und direkt proportional zur Größe der Eingabedaten. Ein Beispiel für O (n) wäre das Einfügen und Löschen einer ArrayList an einer zufälligen Position. Da jedes nachfolgende Einfügen / Löschen an einer zufälligen Position dazu führt, dass sich die Elemente in der ArrayList nach links und rechts von ihrem internen Array verschieben, um ihre lineare Struktur beizubehalten, ganz zu schweigen von der Erstellung neuer Arrays und dem Kopieren von Elementen aus den alten Ein neues Array, das daher teure Verarbeitungszeit in Anspruch nimmt, beeinträchtigt die Leistung.

leCodera
quelle
4

"Big O-Notation" ist eine Möglichkeit, die Geschwindigkeit von Algorithmen auszudrücken. nist die Datenmenge, mit der der Algorithmus arbeitet. O(1)bedeutet, dass unabhängig von der Anzahl der Daten diese in konstanter Zeit ausgeführt werden. O(n)bedeutet, dass es proportional zur Datenmenge ist.

Zifre
quelle
3

Grundsätzlich bedeutet O (1), dass seine Rechenzeit konstant ist, während O (n) bedeutet, dass es direkt von der Größe der Eingabe abhängt - dh das Durchlaufen eines Arrays hat O (n) - nur das Durchlaufen -, da es von der Anzahl abhängt von Elementen, während die Berechnung des Maximums zwischen zu gewöhnlichen Zahlen hat O (1).

Wikipedia könnte ebenfalls helfen: http://en.wikipedia.org/wiki/Computational_complexity_theory

Seb
quelle
3

Der einfachste Weg, O (1) und O (n) zu unterscheiden, ist der Vergleich von Array und Liste.

Wenn Sie für ein Array den richtigen Indexwert haben, können Sie sofort auf die Daten zugreifen. (Wenn Sie den Index nicht kennen und das Array durchlaufen müssen, ist es nicht mehr O (1).)

Für die Liste müssen Sie immer eine Schleife durchlaufen, ob Sie den Index kennen oder nicht.

Codingbear
quelle
Ich habe nach einem Beispiel für O (1) gesucht und nur diese Antwort hat die Erklärung dafür.
Neelmeg
3

Hier ist eine einfache Analogie; Stellen Sie sich vor, Sie laden Filme online mit O (1) herunter. Wenn das Herunterladen eines Films 5 Minuten dauert, dauert das Herunterladen von 20 Filmen immer noch genauso lange. Es spielt also keine Rolle, wie viele Filme Sie herunterladen, sie dauern dieselbe Zeit (5 Minuten), unabhängig davon, ob es sich um einen oder 20 Filme handelt. Ein normales Beispiel für diese Analogie ist, wenn Sie in eine Filmbibliothek gehen, unabhängig davon, ob Sie einen oder fünf Filme aufnehmen, werden Sie diese einfach sofort auswählen. Daher die gleiche Zeit verbringen.

Wenn mit O (n) das Herunterladen eines Films 5 Minuten dauert, dauert das Herunterladen von 10 Filmen etwa 50 Minuten. Die Zeit ist also nicht konstant oder irgendwie proportional zur Anzahl der Filme, die Sie herunterladen.

Ambroze kweronda
quelle
1

Dies bedeutet, dass die Zugriffszeit konstant ist. Unabhängig davon, ob Sie von 100 oder 100.000 Datensätzen aus zugreifen, ist die Abrufzeit gleich.

Im Gegensatz dazu würde die O (n) -Zugriffszeit anzeigen, dass die Abrufzeit direkt proportional zur Anzahl der Datensätze ist, von denen aus Sie zugreifen.

Rob Hruska
quelle
1

Dies bedeutet, dass der Zugriff eine konstante Zeit in Anspruch nimmt, dh nicht von der Größe des Datensatzes abhängt. O (n) bedeutet, dass der Zugriff linear von der Größe des Datensatzes abhängt.

Das O ist auch als Big-O bekannt.

dirkgently
quelle
1

Einführung in Algorithmen: Die zweite Ausgabe von Cormen, Leiserson, Rivest & Stein sagt auf Seite 44, dass

Da jede Konstante ein Polynom vom Grad 0 ist, können wir jede konstante Funktion als Theta (n ^ 0) oder Theta (1) ausdrücken. Diese letztere Notation ist jedoch ein geringfügiger Missbrauch, da nicht klar ist, welche Variable zur Unendlichkeit tendiert. Wir werden oft die Notation Theta (1) verwenden, um entweder eine konstante oder eine konstante Funktion in Bezug auf eine Variable zu bedeuten. ... Wir bezeichnen mit O (g (n)) ... die Menge der Funktionen f (n) so, dass positive Konstanten c und n0 existieren, so dass 0 <= f (n) <= c * g (n) für alle n> = n0. ... Beachten Sie, dass f (n) = Theta (g (n)) f (n) = O (g (n)) impliziert, da die Theta-Notation stärker ist als die O-Notation.

Wenn ein Algorithmus in O (1) -Zeit ausgeführt wird, bedeutet dies, dass asymptotisch keine Variable abhängt, was bedeutet, dass mindestens eine positive Konstante existiert, die bei Multiplikation mit eins größer ist als die asymptotische Komplexität (~ Laufzeit) der Funktion für Werte von n über einem bestimmten Betrag. Technisch ist es O (n ^ 0) Zeit.

P. Myer Nore
quelle
-2

O (1) bedeutet Direktzugriff. In jedem Direktzugriffsspeicher ist die Zeit, die für den Zugriff auf ein Element an einem beliebigen Ort benötigt wird, dieselbe. Hier kann die Zeit eine beliebige Ganzzahl sein, aber das einzige, woran man sich erinnern muss, ist die Zeit, die benötigt wird, um das Element an der (n-1) -ten oder n-ten Stelle abzurufen, die gleich ist (dh konstant ist).

Während O (n) von der Größe von n abhängt.

Basant
quelle
Es hat nichts mit wahlfreiem Zugriff zu tun - siehe die akzeptierte Antwort, die fast ein Jahr vor dieser Antwort veröffentlicht wurde, für weitere Informationen
Krease
-3

Nach meiner Perspektive

O (1) bedeutet, dass die Zeit zum Ausführen einer Operation oder eines Befehls zu einer Zeit eine Zeitkomplexitätsanalyse des Algorithmus für den besten Fall ist.

amarjeet
quelle
6
Versuchen Sie es stärker. Diese spezielle Frage braucht nicht nur eine Perspektive, sondern eine klare Definition.
Alfabravo