Ich suche einen effizienten Algorithmus für das Problem:
Eingabe : Die positive ganze Zahl (als Bits gespeichert) für eine ganze Zahl . n ≥ 0
Ausgabe : Die Nummer .
Frage : Können wir aus den Bits von in Zeit berechnen ?3 n O ( n )
Dies ist eine theoretische Frage, die durch meine Antwort auf eine math.SE- Frage motiviert ist. Wie finde ich eine Formel für diese Bijektion? . In dieser Frage wollte der Autor eine Bijektion aus und den natürlichen Zahlen . Ich schlug als Lösung vor. Eine andere Antwort dort behauptete "es gibt keine einfache Formel", was mich fragen lässt, wie (rechnerisch) einfach meine vorgeschlagene Lösung ist.N = { 1 , 2 , … } 2 m 3 n ↦ 2 m ( 2 n + 1 )
Wenn wir mit meiner vorgeschlagenen Lösung und , können wir leicht berechnen (schreiben Sie die Binärziffern von gefolgt von gefolgt von Nullen). Dies dauert .m 2 m ( 2 n + 1 ) n 1 m O ( n + m )
Das Finden von aus den Bits von läuft darauf hinaus, das niedrigstwertige Bit zu finden (das berechnet werden kann, indem die richtigen Bitverschiebungen gezählt werden und im Speicher verbleiben ). Dies dauert Zeit.2 m 3 n 3 n O ( m )
Wir müssen jedoch auch finden , was schwieriger sein könnte. Es wäre möglich, durch wiederholtes Teilen durch , aber dies scheint verschwenderisch. Es erfordert Divisionsoperationen, von denen jede Zeit benötigt, also ist dies insgesamt Zeit. [Tatsächlich nimmt die Anzahl der Stellen nach jeder Iteration linear ab, dies führt jedoch immer noch zu einer -Zeit.]n 3 n O ( n ) O ( n 2 ) O ( n 2 )
Es scheint, als sollten wir in der Lage sein, das Wissen auszunutzen, dass die Eingabe eine Potenz von .