Normalerweise kümmern wir uns in Algorithmen nicht um Vergleich, Addition oder Subtraktion von Zahlen - wir gehen davon aus, dass sie in der Zeit ablaufen . Wir nehmen dies beispielsweise an, wenn wir sagen, dass die vergleichsbasierte Sortierung ist. Wenn Zahlen jedoch zu groß sind, um in Register zu passen, stellen wir sie normalerweise als Arrays dar, sodass grundlegende Operationen zusätzliche Berechnungen pro Element erfordern.O ( n log n )
Gibt es einen Beweis dafür, dass der Vergleich zweier Zahlen (oder anderer primitiver arithmetischer Funktionen) in ? Wenn nicht, warum sagen wir dann, dass die vergleichsbasierte Sortierung ?O ( n log n )
Ich dieses Problem auftreten , wenn ich eine SO Frage beantwortet , und ich erkennen , dass mein Algorithmus nicht ist , da früher oder später ich mit Big-int umgehen sollte, auch war es nicht Pseudopolynomiell Algorithmus, es war P .
Antworten:
Für Leute wie mich, die Algorithmen für ihren Lebensunterhalt studieren, ist das Standardrechenmodell des 21. Jahrhunderts der Integer-RAM . Das Modell soll das Verhalten realer Computer genauer widerspiegeln als das Modell der Turing-Maschine. Reale Computer verarbeiten Mehrbit-Ganzzahlen mit paralleler Hardware in konstanter Zeit. keine willkürlichen ganzen Zahlen, aber (weil die Wortgröße im Laufe der Zeit stetig wächst) auch keine ganzen Zahlen mit fester Größe .
Das Modell hängt von einem einzelnen Parameter , der als Wortgröße bezeichnet wird . Jede Speicheradresse enthält eine einzelne w- Bit-Ganzzahl oder ein einzelnes Wort . In diesem Modell ist die Eingabegröße n die Anzahl der Wörter in der Eingabe, und die Laufzeit eines Algorithmus ist die Anzahl der Operationen an Wörtern . Standard arithmetische Operationen (Addition, Subtraktion, Multiplikation, Division der ganzen Zahl, Rest, Vergleich) und boolesche Operationen (bitweise AND-, OR-, XOR-, Shift, drehen) auf Wörtern benötigen O ( 1 ) Zeit , nach Definition .w w n O ( 1 )
Formal ist die Wortgrößew für die Analyse von Algorithmen in diesem Modell KEINE Konstante . Um das Modell mit der Intuition in Einklang zu bringen, benötigen wir , da wir sonst nicht einmal die ganze Zahl n in einem einzigen Wort speichern können . Bei den meisten nichtnumerischen Algorithmen ist die Laufzeit jedoch unabhängig von w , da diese Algorithmen die zugrunde liegende binäre Darstellung ihrer Eingabe nicht berücksichtigen. Mergesort und Heapsort werden beide in O ( n log n ) ausgeführt . Median-of-3-Quicksort läuft in O ( n 2w ≥ log2n n w O ( n logn ) Zeit im schlimmsten Fall. Eine bemerkenswerte Ausnahme ist die binäre Radix-Sortierung, die in der O ( n w ) -Zeit ausgeführt wird.O ( n2) O ( n w )
Wenn Sie einstellen, erhalten Sie das traditionelle logarithmisch kostenpflichtige RAM-Modell. Einige Ganzzahl-RAM-Algorithmen sind jedoch für größere Wortgrößen ausgelegt, wie der Linear-Time-Ganzzahl-Sortieralgorithmus von Andersson et al. Dies erfordert w = Ω ( log 2 + ε n ) .w = Θ ( logn ) w = Ω ( log2 + εn )
Für viele in der Praxis auftretende Algorithmen ist die Wortgröße einfach kein Problem, und wir können (und können) auf das weitaus einfachere RAM-Modell mit einheitlichen Kosten zurückgreifen. Die einzige ernsthafte Schwierigkeit ist die verschachtelte Multiplikation, mit der sehr große ganze Zahlen sehr schnell erstellt werden können. Wenn wir mit beliebigen ganzen Zahlen in konstanter Zeit rechnen könnten, könnten wir jedes Problem in PSPACE in polynomialer Zeit lösen .w
Update: Ich sollte auch erwähnen, dass es Ausnahmen zum "Standardmodell" gibt, wie den Ganzzahlmultiplikationsalgorithmus von Fürer , der Multitape-Turing-Maschinen (oder äquivalent das "Bit-RAM") verwendet, und die meisten geometrischen Algorithmen, die theoretisch analysiert werden sauberes aber idealisiertes "echtes RAM" Modell .
Ja, das ist eine Dose Würmer.
quelle
Es kommt nur auf den Kontext an. Wenn wir uns mit der Komplexität von Algorithmen auf Bitebene befassen , sagen wir nicht, dass die Addition von zwei Bit-Zahlen O ( 1 ) ist , wir sagen, dass es O ( n ) ist . Ähnliches gilt für Multiplikation usw.n O ( 1 ) O ( n )
quelle
Um die Frage wie folgt zu beantworten: Algorithmiker tun dies einfach ziemlich oft unter Verwendung des RAM-Modells. Zum Sortieren wird in vielen Fällen sogar das einfachere Vergleichsmodell analysiert , auf das ich in der verknüpften Antwort etwas näher eingehen werde.
Um die implizite Frage zu beantworten, warum sie es tun: Ich würde sagen, dass dieses Modell für bestimmte Arten von kombinatorischen Algorithmen, bei denen die Zahlen alle "klein" sind und auf realen Maschinen in Register passen, eine ziemlich gute Vorhersagekraft hat.
Um implizite Folgemaßnahmen zu numerischen Algorithmen zu beantworten: Nein, das einfache alte RAM-Modell ist hier nicht der Standard. Auch die Eliminierung nach Gauß kann einige Sorgfalt erfordern. Typischerweise wird für Rangberechnungen das Schwartz-Lemma eingegeben (z. B. Abschnitt 5 hier ). Ein weiteres kanonisches Beispiel ist die Analyse des Ellipsoid-Algorithmus, dessen Analyse einige Sorgfalt erfordert .
Und schließlich: Die Leute haben schon vor kurzem über das Sortieren von Zeichenketten nachgedacht .
Update: Das Problem bei dieser Frage ist, dass "wir" und "vermuten" nicht so genau spezifiziert sind. Ich würde sagen, dass die Leute, die im RAM-Modell arbeiten, keine numerischen Algorithmen oder Komplexitätstheorien anwenden (wo die Bestimmung der Komplexität der Teilung ein gefeiertes Ergebnis war ).
quelle
python -mtimeit "$a * $b"
$a
$b = 2*$a
quelle
quelle
Ich würde sagen, dass wir normalerweise O (1) -Arithmetikoperationen annehmen, weil wir normalerweise Dinge im Kontext von 32-Bit-Ganzzahlen oder 64-Bit-Ganzzahlen oder IEEE 754-Gleitkommazahlen tun. O (1) ist wahrscheinlich eine ziemlich gute Näherung für diese Art von Arithmetik.
Aber im Allgemeinen stimmt das nicht. Im Allgemeinen benötigen Sie einen Algorithmus, um Addition, Subtraktion, Multiplikation und Division durchzuführen. Boolos, Burgess und Jefferies ' Computability and Logic kommen in den Sinn, um die Beweise dafür in Bezug auf einige verschiedene formale Systeme, rekursive Funktionen und Abacus-Maschinen zumindest in meiner 4. Ausgabe zu verstehen.
Sie können sich die Lambda-Kalkül-Terme für die Subtraktion und Division mit Church Numerals ansehen, um eine leicht verständliche Erklärung dafür zu erhalten, warum diese beiden Operationen nicht O (1) sind. Es ist etwas schwieriger zu sehen, was Addition, Multiplikation und Potenzierung angeht, aber wenn man die Form der Gemeindezahlen selbst betrachtet, ist dies der Fall.
quelle