Zeitliche Komplexität der Addition

11

Wikipedia listet die zeitliche Komplexität der Addition als , wobei die Anzahl der Bits ist.nn

Ist das eine starre theoretische Untergrenze? Oder ist dies nur die Komplexität des derzeit schnellsten bekannten Algorithmus? Ich möchte wissen, weil die Komplexität der Addition alle anderen arithmetischen Operationen und alle Algorithmen, die sie verwenden, unterstreicht.

Ist es theoretisch unmöglich, einen Additionsalgorithmus zu erhalten, der in läuft ? Oder sind wir zur Addition an lineare Komplexität gebunden?o(n)

Tobi Alafin
quelle

Antworten:

17

Wenn Ihr Algorithmus asymptotisch weniger als Zeit verwendet, hat er nicht genügend Zeit, um alle Ziffern der hinzugefügten Zahlen zu lesen. Sie können sich vorstellen, dass Sie mit sehr großen Zahlen umgehen (beispielsweise in 8-MB-Textdateien gespeichert). Natürlich kann die Addition im Vergleich zum Wert der Zahlen sehr schnell erfolgen ; Es wird in der Zeit , wenn der Wert der Summe ist.nO(log(N))N

Dies bedeutet nicht, dass Sie die Dinge ein wenig beschleunigen können. Wenn Ihr Prozessor bei jeder Operation 32 Bit verarbeitet, verwenden Sie die Zeit , aber das ist immer noch und nicht .n32O(n)o(n)

Lieuwe Vinkhuijzen
quelle
Ist das Lesen aller Daten theoretisch notwendig. Für die Addition von zwei beliebigen Zahlen und b gilt a : a b , a + b 2 a . Die Berechnung von 2 a kann im O ( 1 ) -Betrieb durch Schalten erfolgen. Anhängen einer 0 . Berücksichtige das. Wenn Sie keine schnellere Schätzung für die Summe finden, verfeinern Sie diese Schätzung, bis sie korrekt ist. In weniger als n Operationen? ab,a:ab,a+b2a2aO(1)0n
Tobi Alafin
3
Ja, es ist eine theoretische Notwendigkeit, weil: jedes Bit der Eingabe nicht trivial in der Ausgabe verwendet wird , wobei ich mit nicht trivial meine, dass es nicht die Identitätsfunktion ist. In Ihrem Beispiel, ob 2 a in berechnet wird O ( 1 ) Zeit ist abhängig von dem Rechenmodell: Wenn ein Anfügen 0 ein konstanten Zeitbetrieb ist, dann ja. Wenn Sie RAM-Zugriff haben, benötigen Sie O ( log ( n ) ) Zeit, um die Adresse des Bits zu schreiben, wenn Sie bereits die Länge von a oder O ( n ) kennen.2a2aO(1)0O(log(n))aO(n)Zeit , wenn Sie alle haben zu lesen , , um herauszufinden. In diesem 2 ein Beispiel sind viele Ausgangsbits triviale Funktionen von Eingangsbits. a2a
Lieuwe Vinkhuijzen
Ich habe einen Algorithmus, der die Länge von in O ( log n ) findet . Es verwendet die binäre Suche. aO(logn)
Tobi Alafin
3
@TobiAlafin Wenn Ihr Modell die RAM-Adressierung unterstützt, wird Ihre binäre Suche in Schritten von . Auf Turing Machine und in einer Textdatei, die nicht in den Hauptspeicher geladen wurde, dauert dies O ( n ) . In beiden Fällen muss Ihr Algorithmus zur Beantwortung Ihrer Frage mit oder ohne RAM-Adressierung zur Beschleunigung der Suche alle Bits der Eingabe untersuchen, um a + b zu berechnen . Angenommen, dies ist nicht der Fall , und bei einer Eingabe von 42 Bit wird das 6. Bit nicht überprüft . Dann könnte ich dieses Bit umdrehen, und es würde die falsche Antwort geben. O(logn)O(n)a+b426
Lieuwe Vinkhuijzen
1
Grundsätzlich sind alle Operationen aus diesem Grund . Die einzige Ausnahme ist, wenn Sie es mit einer irgendwie geordneten Datenstruktur zu tun haben: z. B. müssen Sie nicht eine ganze BST besuchen, um zu überprüfen, ob sie einen bestimmten Wert enthält, aber dies gilt nur aufgrund der Invarianten, die mit der BST geliefert werden. Ω(n)
Bakuriu
7

Damit die Komplexitätsanalyse überhaupt einen formalen Sinn ergibt, müssen Sie ein formales Rechenmodell angeben, in dem der Algorithmus im Objekt ausgeführt wird, oder zumindest ein Kostenmodell , das die grundlegenden Operationen und festlegt ihre Kosten.

In den meisten Kontexten wird angenommen, dass arithmetische Operationen Zeit benötigen . Dies ist normalerweise sinnvoll, da wir an der algorithmischen Komplexität unabhängig von den beteiligten Zahlen interessiert sind. Dies wird als einheitliches Kostenmodell bezeichnet .Θ(1)

Wenn Zahlen unbegrenzt wachsen können oder wir daran interessiert sind, die Operationen selbst zu analysieren, wird angenommen, dass arithmetische Operationen Kosten , die proportional zur Größe der Eingabe sind.Θ(|x|)

Können Operationen Kosten verursachen, die geringer sind? Möglicherweise müssen Sie jedoch ein Rechenmodell formal definieren, in dem dies geschehen kann.

schnelle Sorte
quelle
1
Als zusätzliches Beispiel benötigt ein Carry-Look-Ahead-Addierer unter geeigneten vereinfachenden Annahmen Zeit, um die Summe von zwei n- Bit-Zahlen zu berechnen . Θ(logn)n
Fabio Somenzi
3

Die Eingabe zur Addition besteht aus zwei beliebigen Zahlen. Da sie beliebig sind, müssen Sie jedes Bit lesen, und daher ist der Algorithmus .Ω(n)

Stellen Sie sich vor, Ihr Algorithmus fügt erfolgreich 1010100110 und 0010010110 hinzu, ohne jedes Bit zu lesen. Damit Ihr Algorithmus beliebige Eingaben hinzufügen kann, sollte ich in der Lage sein, eines dieser Bits zufällig umzudrehen, und der Algorithmus gibt immer noch eine korrekte (aber unterschiedliche) Addition aus. Aber wenn Ihr Algorithmus nicht jedes Bit liest, wie kann er dann feststellen, dass sich die gespiegelte Eingabe von der ursprünglichen Eingabe unterscheidet?

murrdpirate
quelle
Was ich dachte, wäre ein Mittel, um die Summe in weniger als Operationen zu approximieren . n
Tobi Alafin
Absolut. Sie müssen nur definieren, was "ungefähr" in Ihrem Algorithmus bedeutet. Abhängig von dieser Definition könnte das Hinzufügen der beiden höchstwertigen Bits eine ungefähre Summe sein, die in o (n) Zeit erfolgen könnte. Wenn Sie den "Additions" -Algorithmus erwähnen, denken wir alle, dass die Antwort genau sein muss.
Murrdpirate