Frage: Wie kann man bei einer natürlichen Bit-Zahl nur mit (Bit) und berechnen ?N ⌈ √O(n)
Der Tipp ist die binäre Suche. Ich konnte jedoch die erforderliche Komplexität nicht erreichen (ich habe ).
Was bedeutet es mit using only $O(n)$ (bit) additions and shifts
:
Dies ist eine Übung in einem Algorithmusbuch.
Meiner Meinung nach bedeutet dies, dass das Addieren von zwei natürlichen Zahlen , beispielsweise Bit, kostet und das Verschieben einer natürlichen Zahl von beispielsweise Bit ebenfalls kostet . Dann dürfen wir solche -Operationen nur -mal verwenden.
Die Vergleichskosten werden nicht erwähnt. Ich denke, wir können es ignorieren oder davon ausgehen, dass der Vergleich von zwei natürlichen Zahlen , beispielsweise Bit, ebenfalls kostet .O ( 1 ) n O ( 1 ) , O ( 1 ) , O ( n ) n O ( 1 )
Mein -Algorithmus :
- Bestimmen Sie den Bereich der Anzahl der Bits von :
Daher ist
t_1 \ triangleq \ lfloor \ frac {n-1} {2} \ rfloor + 1 \ le t \ le \ lceil \ frac {n} {2} \ rceil + 1 \ triangleq t_2.⌈ √2 n - 1t1≜⌊n-1
- Binäre Suche: Finden Sie zwischen und mithilfe der binären Suche. Für jede Zahl , zu berechnen Additionen und Verschiebungen als Primitive verwendet und vergleicht ihn mit .
Die Komplexität ist somit für Zeiten der binären Suche und Berechnung von , von denen jede wiederum Additionen und Verschiebungen benötigt.O ( n ) × 2 O ( n )
quelle
Sprechen wir hier über ganze Zahlen? Wo ist N n Bits lang?
Die Schleife wird n / 2 Mal ausgeführt, was zu einer O (n) -Leistung führen sollte
Edit: Wie funktioniert es und warum?
Dies ist eine Version von Successive Approximation, die auch in CORDIC-Algorithmen verwendet wird.
Beginnend mit dem größtmöglichen Einzelbit (mit einem Quadrat kleiner als N) setzen Sie jeweils ein Bit und berechnen das neue Quadrat.
Wenn das neue Quadrat immer noch kleiner als N ist, behalten Sie das gesetzte Bit bei.
Wenn das neue Quadrat zu groß ist, löschen Sie das Bit, machen Sie den Effekt des Hinzufügens rückgängig und fahren Sie mit dem nächsten Bit fort.
Beispiel: N = 441 (1 1011 1001 binär), n = 9
quelle
Die Hauptmethode besteht darin, die Bits von auszufüllenN−−√ N b b
quelle
Ich mag die Antwort von Alan Campbell : Durch sorgfältiges Verfolgen früherer Vermutungen ist die neue Subtraktion jedes Mal einfach, und die binäre Quadratwurzel zum Verschieben und Hinzufügen ist ungefähr so schnell wie eine binäre Teilung zum Verschieben und Hinzufügen.
Es kann jedoch möglich sein, schneller zu gehen, indem Sie Ihre nächste Schätzung nicht zu einer einzelnen Binärziffer machen, sondern stattdessen einen "Ab" x "Ab" -Algorithmus verwenden und Ihre nächste Schätzung zum Durchschnitt Ihrer vorherigen Schätzung und zur geteilten ursprünglichen Zahl machen durch die vorherige Vermutung. Das klingt so, als würde es länger dauern, nicht kürzer. Die Aufteilung muss jedoch nicht genau sein. Wenn die Division also nur bis zur Quadratwurzel der Anzahl der zu findenden Stellen läuft, sparen Sie möglicherweise Zeit. Wenn Sie für Ihre Division die französische Methode der Kurzschriftdivision verwenden, können Sie außerdem tatsächlich eine gewisse Geschwindigkeit in Ihrer Berechnung für wirklich große Divisionen brechen.
Wenn wir nun parallel Berechnungen hinzufügen, die vorläufige korrigierbare Ergebnisse liefern, bevor die Antwort gefunden wird, dann sind wir vielleicht auf etwas fixiert.
quelle