Schnelle Codierung von ausgeglichenen Vektoren


10

Es ist leicht zu erkennen, dass für jedes eine 1-1-Abbildung von {0,1} auf {0,1} so dass für jedes der Vektor ist "ausgeglichen", dh es hat die gleiche Anzahl von Einsen und Nullen. Ist es möglich, ein solches so zu definieren , dass wir mit effizient berechnen können ?F n n + O ( log n ) x F ( x ) F x F ( x )nFnn+O(logn)xF(x)FxF(x)

Vielen Dank.


Ich gehe davon aus, dass Sie mit "effizient" O (n) oder so ungefähr meinen und das Argument "wiederholte zufällige Versuche" ausschließen?
Suresh Venkat

@Suresh, könnten Sie das Argument "wiederholte zufällige Versuche" skizzieren?
Emil

Ein Weg, um zu beweisen, dass das Mapping existiert, ist die probabilistische Methode: Wählen Sie F zufällig aus, und dann funktioniert das Mapping mit einer gewissen Wahrscheinlichkeit. Das ist es was ich meinte.
Suresh Venkat

1
Die Frage ist genau definiert, aber meiner Meinung nach ist der Titel irreführend. Ich würde eine Abbildung F, die die angegebene Bedingung erfüllt, nicht als "Codierung ausgeglichener Vektoren" bezeichnen, es sei denn, F ist bijektiv. Es ist eher eine Codierung eines n-Bit-Strings durch einen ausgeglichenen Vektor.
Tsuyoshi Ito

"Perfekt definiert" bis hin zu möglicherweise unterschiedlichen Interpretationen von "effizient", meine ich. Dies ist jedoch nicht der Punkt meines vorherigen Kommentars.
Tsuyoshi Ito

Antworten:


12

Betrachten wir Bit-Strings . Definitionen:xnx

  • x if(x,i) = Bitfolge wobei die letzten Bits ergänzt werden.xi
  • x x - xb(x) = "Ungleichgewicht" von : Anzahl von 1s in Anzahl von 0s in .xx x

Korrigieren Sie nun eine Zeichenfolge . Betrachten Sie die Funktion . Beobachtungen:g ( i ) = b ( f ( x , i ) )xg(i)=b(f(x,i))

  • g(0)=b(x) .
  • g(n)=g(0) .
  • i|g(i)g(i+1)|=2 für alle . Wir entfernen entweder eine 0 und fügen eine 1 hinzu oder umgekehrt.i

Nun folgt, dass es ein so dass .- 1 g ( i ) + 1i1g(i)+1

Daher können wir eine -Bit-Zeichenfolge wie folgt konstruieren : Verketten Sie und die binäre Codierung des Index . Der absolute Wert des Ungleichgewichts von ist . Darüber hinaus können wir mit wiederherstellen ; Das Mapping ist Bijektion.y f ( x , i ) i y O ( log n ) x y(n+O(logn))yf(x,i)iyO(logn)xy

Schließlich können Sie -Dummy-Bits hinzufügen , die das Ungleichgewicht von von auf reduzieren .O(logn)yO(logn)0


b (x) in der 3. Zeile sollte b (y) sein.
Emil

Ich denke, dass Sie der Zeichenfolge x möglicherweise ein weiteres Bit hinzufügen müssen, um sicherzustellen, dass sie eine gerade Länge hat (damit Sie sicher sein können, dass g (i) für einige i Null ist).
Emil

@Emil: Ich behaupte nicht, dass für einige Null ist ; es ist ausreichend, dass der absolute Wert von für einige "ziemlich klein" ist (höchstens logarithmisch wäre ausreichend, aber es ist leicht zu zeigen, dass er für einige höchstens ). g(i)ig(i)i1i
Jukka Suomela

@ Jukka: Ah ja ich verstehe.
Emil

1
Aber ja, Sie haben Recht, es gibt viele Varianten des gleichen grundlegenden Ansatzes. Wie Sie vorgeschlagen haben, können Sie beispielsweise zuerst ein Füllbit verwenden, um sicherzustellen, dass für einige gleich Null ist . dann können Sie codieren, indem Sie die Bitpaare oder , dh zusätzliche Bits; dann ist das Ergebnis der Verkettung streng ausgeglichen und Sie müssen nichts weiter hinzufügen. g(i)ii01102log(n)
Jukka Suomela

9

Verwenden Sie die Zuordnung, die die lexikografische Reihenfolge beibehält. Um den ten Längen- ausgeglichenen Vektor mit Einsen zu finden , gehen Sie rekursiv vor: Wenn , setzen Sie das erste Bit 0 und suchen Sie dann die te Länge - Vektor mit Einsen, um die verbleibenden Bits zu vervollständigen . Andernfalls setzen Sie das erste Bit 1 und finden Sie den -ten Längen- Vektor mit 1.knn/2k(n-1)n/2n-1k-(n-1k(n1n/2)k(n1)n/2n1(n-1)n/2-1k(n1n/2)(n1)n/21


1
Wenn Sie den Wert eines Binomialkoeffizienten erneut verwenden, um den nächsten erforderlichen Binomialkoeffizienten zu berechnen, wird der gesamte Algorithmus in O (n) -Zeit ausgeführt.
Tsuyoshi Ito

Vielen Dank! Das macht Sinn. Ich denke, die Laufzeit wird vom Rechenmodell abhängen. Wenn Sie Operationen mit n-Bit-Zahlen in Zeiteinheiten ausführen können, wird die Implementierung von Tsuyoshi Ito in O (n) -Zeit ausgeführt. Wenn Sie dagegen Bitoperationen zählen, ist die Zeit O (n ^ 2), denke ich.
Piotr
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.