Binärcode mit Einschränkung

7

Angenommen, ich habe ein Alphabet mit n Symbolen. Ich kann sie effizient mit codierenlog2n-bits Strings. Zum Beispiel, wenn n = 8:
A: 0 0 0
B: 0 0 1
C: 0 1 0
D: 0 1 1
E: 1 0 0
F: 1 0 1
G: 1 1 0
H: 1 1 1

Jetzt habe ich die zusätzliche Einschränkung, dass jede Spalte höchstens p Bits enthalten muss, die auf 1 gesetzt sind. Zum Beispiel für p = 2 (und n = 8) ist eine mögliche Lösung:
A: 0 0 0 0 0
B: 0 0 0 0 1
C: 0 0 1 0 0
D: 0 0 1 1 0
E: 0 1 0 0 0
F: 0 1 0 1 0
G: 1 0 0 0 0
H: 1 0 0 0 1

Gibt es bei n und p einen Algorithmus, um eine optimale Codierung (kürzeste Länge) zu finden? (und kann bewiesen werden, dass es eine optimale Lösung berechnet?)

BEARBEITEN

Bisher wurden zwei Ansätze vorgeschlagen, um eine Untergrenze für die Anzahl der Bits abzuschätzen m. Ziel dieses Abschnitts ist es, eine Analyse und einen Vergleich der beiden Antworten bereitzustellen, um die Auswahl der besten Antwort zu erläutern .

Yuvals Ansatz basiert auf Entropie und bietet eine sehr schöne Untergrenze:lognh(p/n) wo h(x)=xlogx+(1x)log(x).

Alex 'Ansatz basiert auf Kombinatorik. Wenn wir seine Argumentation etwas weiterentwickeln, ist es auch möglich, eine sehr gute Untergrenze zu berechnen:

Gegeben m die Anzahl der Bits lÖG2(n)gibt es eine einzigartige kso dass Man kann sich davon überzeugen, dass eine optimale Lösung das Codewort mit allen niedrigen Bits verwendet, dann die Codewörter mit 1 Bit hoch, 2 Bit hoch, ..., k Bits hoch . Für die verbleibenden zu codierenden Symbole ist überhaupt nicht klar, welche Codewörter optimal verwendet werden sollen, aber mit Sicherheit die Die Gewichte jeder Spalte sind größer als sie wären, wenn wir nur Codewörter mit Bit hoch verwenden könnten und für alle . Daher kann eine untere Grenze mit

1+(m1)+...+(mk)<n1+(m1)+...+(mk)+(mk+1)
n- -1- -(m1)- -...- -(mk)wichk+1|wich- -wj|1ich,jp=meinx(wich)
pm=0+1+(m- -12)+...+(m- -1k- -1)+(n- -1- -(m1)- -...- -(mk))(k+1)m

Versuchen Sie nun mit und , zu schätzen . Wir wissen, dass , wenn also , dann . Dies ergibt die Untergrenze für . Berechnen Sie zuerst den und finden dann das größte so dassnpmpmpp<pm'm'<mmpmm'p<pm'

Dies ist, was wir erhalten, wenn wir für die beiden unteren Grenzen zusammen zeichnen, die untere Grenze basierend auf der Entropie in Grün, diejenige basierend auf der kombinatorischen Argumentation oben in Blau, erhalten wir:n=1000Geben Sie hier die Bildbeschreibung ein

Beide sehen sich sehr ähnlich. Wenn wir jedoch den Unterschied zwischen den beiden unteren Grenzen darstellen, ist es klar, dass die untere Grenze, die auf kombinatorischen Überlegungen basiert, insgesamt besser ist, insbesondere für kleine Werte von .p

Geben Sie hier die Bildbeschreibung ein

Ich glaube, dass das Problem von der Tatsache herrührt, dass die Ungleichung schwächer ist, wenn kleiner wird, weil die einzelnen Koordinaten mit kleinem korrelieren . Dies ist jedoch immer noch eine sehr gute Untergrenze, wenn .H.(X.)H.(X.ich)ppp=Ω(n)

Hier ist das Skript (python3), mit dem die unteren Grenzen berechnet wurden:

from scipy.misc import comb
from math import log, ceil, floor
from matplotlib.pyplot import plot, show, legend, xlabel, ylabel

# compute p_m 
def lowerp(n, m):
  acc = 1
  k = 0
  while acc + comb(m, k+1) < n:
    acc+=comb(m, k+1)
    k+=1

  pm = 0
  for i in range(k):
    pm += comb(m-1, i)

  return pm + ceil((n-acc)*(k+1)/m)

if __name__ == '__main__':
  n = 100

  # compute lower bound based on combinatorics
  pm = [lowerp(n, m) for m in range(ceil(log(n)/log(2)), n)]
  mp  = []
  p = 1
  i = len(pm) - 1
  while i>= 0:
    while i>=0 and pm[i] <= p: i-=1
    mp.append(i+ceil(log(n)/log(2)))
    p+=1
  plot(range(1, p), mp)

  # compute lower bound based on entropy
  lb = [ceil(log(n)/(p/n*log(n/p)+(n-p)/n*log(n/(n-p)))) for p in range(1,p)]
  plot(range(1, p), lb)

  xlabel('p')
  ylabel('m')
  show()

  # plot diff
  plot(range(1, p), [a-b for a, b in zip(mp, lb)])
  xlabel('p')
  ylabel('m')
  show()
user3017842
quelle
1
@ DW die Einschränkung ist ganz wie Ihre Zustände. Jede Spalte darf höchstens p Bits enthalten, die auf 1 gesetzt sind . Die Bit 1 an jeder Position aller ausgewählten Schlüssel überschreiten p nicht. Aber ich denke, der erste Schritt besteht immer noch darin, die Kapazität jeder Bitbreite zu zählen.
Terence Hang
user3017842, Ich vermute, Ihre letzte Änderung sollte als Selbstantwort veröffentlicht werden. Ich denke, es steht allein als Antwort auf Ihre Frage. Sind Sie einverstanden? Wenn ja, ist der richtige Ort dafür eher im Antwortfeld als in der Frage - das ist für zukünftige Leser, die darauf stoßen, viel sinnvoller (und ermöglicht es der Community auch, über Ihre Antwort abzustimmen). Ich weiß es zu schätzen, dass Sie Ihre Analyse teilen - danke. Ich ermutige Sie, dieses Material als Antwort zu veröffentlichen und es dann aus der Frage zu entfernen. Was denken Sie? Scheint das für Sie sinnvoll zu sein?
DW
@DW Der Abschnitt BEARBEITEN führt nur einen Vergleich zwischen den beiden vorgeschlagenen Antworten durch, um die Auswahl für die beste Antwort zu erläutern . Deshalb wollte ich es nicht als Selbstantwort ausdrücken. Ich stimme jedoch voll und ganz zu, dass es für zukünftige Benutzer an Klarheit mangelt. Deshalb habe ich das Ziel des Abschnitts klargestellt und Links zu den entsprechenden Antworten bereitgestellt. Ich glaube, es ist jetzt etwas klarer.
user3017842

Antworten:

3

Es gibt eine zusätzliche Untergrenze, die wir erstellen können und die Fälle wie das behandelt, was @ user3017842 in ihrem Kommentar zu Yuvals Antwort erwähnt hat. (Fälle, in denen besonders klein ist.) Angenommen, wir wussten bereits: Dann haben wir über alle Codewörter hinweg insgesamt hohe Bits. Da wir an den Fällen interessiert sind, in denen klein ist, betrachten wir diese hohen Bits als unsere begrenzende Ressource und möchten damit einen Code erstellen (und sehen, wie viele Codewörter wir möglicherweise herausholen können). Wir können 1 Codewort mit allen Nullen haben, dann Codewörter mit einer einzelnen 1, dann mit zwei Einsen usw. Wenn wir die höchste Anzahl von Bits in einem Codewort aufrufen , dann pmpmpm(m2)k

pm=01+1m+2(m2)+...ichkich(mich)
Während unsere Anzahl von Codewörtern in ähnlicher Weise durch wenn wir den Fall betrachten, in dem , dann ist bereits durch die erste Ungleichung impliziert. ( ). Dann würde der Code aus dem Wort single-n
nichk(mich)
pmk2pm=m2=m+2(m2)0m1 -words und zweirädrigen -words. Also oder invertieren von Dies ergibt die enge Untergrenze von(p- -1)m/.21
n1+m+(p1)m/2
m2(n1)p+1.
m5 auf dem Beispiel, das Sie zur Verfügung stellen, aber wie bereits erwähnt, wird wahrscheinlich nur währenddessen sehr nützlich sein pm (oder ).pn
Alex Meiburg
quelle
1
Bitte lesen Sie den Abschnitt BEARBEITEN im Hauptbeitrag, um zu sehen, warum Ihre Antwort gewinnt!
user3017842
4

Hier ist eine Untergrenze und eine asymptotisch übereinstimmende Konstruktion, zumindest für einige Bereiche der Parameter. Bezeichnen Sie die Anzahl der Spalten mit und nehmen Sie der Einfachheit halber an, dassmpn/2 .

Wir beginnen mit einer Untergrenze für . Sei die Kodierung des Symbols, das gleichmäßig zufällig ausgewählt wird. Sei die einzelnen Koordinaten und sei das Gewicht der ten Spalte. Dann ist Daher Hier ist die Entropie einer Zufallsvariablen und ist die Entropiefunktion . (Sie können eine beliebige Basis für den gewünschten Logarithmus verwenden.)mXX1,,Xmwipi

logn=H(X)i=1mH(Xi)=i=1mh(wi/n)mh(p/n).
mlognh(p/n).
HH(X)=xPr[X=x]logPr[X=x]hh(x)=xlogx(1x)log(1x)

Die asymptotisch übereinstimmende Konstruktion, die für funktionieren sollte , wählt ein bisschen größer als diese Untergrenze und wählt ein zufälliges Codierungsschema, wobei jedes Bit mit einer Wahrscheinlichkeit die ein Bit ist, auf gesetzt wird kleiner als . Wenn wir die Parameter richtig auswählen, sollten wir feststellen, dass dies mit positiver Wahrscheinlichkeit zu einer legalen Codierung führt (alle Codewörter sind unterschiedlich und alle Spaltengewichte sind höchstens ).p=Ω(n)m1q/np/np

Yuval Filmus
quelle
Schöne Untergrenze. Warum sollte die passende Konstruktion für funktionieren ? Gibt es eine andere Möglichkeit, es zu glauben, als die Wahrscheinlichkeit zu begrenzen, eine ungültige Codierung zu erhalten, wenn in der Nähe der Untergrenze ausgewählt wird? p=Ω(n)m
Ariel
Die Erfahrung zeigt mir, dass es eine hohe Chance hat zu arbeiten, aber Sie können es nicht sicher wissen, ohne es zu versuchen.
Yuval Filmus
Ich glaube, diese Untergrenze ist sehr gut, wenn die einzelnen Koordinaten praktisch unabhängig sind (weil die Ungleichung nahezu gleich ist). Dies ist wahrscheinlich der Fall, wenn nahe genug an . Wenn jedoch klein bleibt, ist dies nicht mehr der Fall. Betrachten Sie zum Beispiel den Extremfall, wenn . X.1,X.2,...,X.mH.(X.)H.(X.ich)pn/.2pp=1
user3017842
1
Wenn ist, ist klar, dass die Anzahl der Bits (wie in Alex Meiburgs Antwort vorgeschlagen). Jedoch . Die Untergrenze wird ungenau, wenn klein bleibt, während groß wird. Außerdem funktioniert die vorgeschlagene Konstruktion für kleine wie aufgrund des bekannten Geburtstagsproblems nicht ganz gut. Trotzdem ist dies ein sehr schöner Ansatz, besonders wenn ! p=1n- -1n- -1- -lÖGnh(p/.n))n/.lÖGnpnpp=1p=Ω(n)
user3017842
Ich habe einen Vergleich mit einer anderen Untergrenze angestellt, die aus kombinatorischen Überlegungen abgeleitet wurde, die in einer anderen Antwort vorgeschlagen wurden. Es stellt sich heraus, dass Ihre Untergrenze etwas schwächer ist, insbesondere wenn kleiner wird. Einzelheiten zum Vergleich finden Sie im Abschnitt BEARBEITEN des Hauptbeitrags. Trotzdem war ich sehr beeindruckt von Ihrer Lösung! Vielen Dank ! p
user3017842
0

Hier ist eine einfache Suchmethode. Wir gehen von einer Untergrenze für die Anzahl der Bits aus und versuchen dann, eine legale Codierung zu finden. Speziell.

Sei m die aktuelle Anzahl von Bits. Codiere das Symbol i als bi1, bi2, ..., bim.

Einschränkungen: bi xor bj ist nicht 0 - mit anderen Worten, die Codierung jedes Symbols ist eindeutig

Für alle j: sum_i bij <= p.

Dies ist ein pseudo-boolesches Erfüllbarkeitsproblem (gut, es kann leicht als Standard-Erfüllbarkeitsproblem codiert werden). Erhöhen Sie also einfach m weiter, bis Sie eine finden, die zufriedenstellend ist (oder führen Sie eine binäre Suche mit unteren und oberen Grenzen durch, um das minimale m zu finden).

Dies garantiert natürlich nicht, dass Sie in der Praxis tatsächlich das minimale m finden können, der SAT-Check könnte eine Zeitüberschreitung verursachen.

MotiN
quelle