Angenommen, ich habe ein Alphabet mit n Symbolen. Ich kann sie effizient mit codieren-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 . 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: wo .
Alex 'Ansatz basiert auf Kombinatorik. Wenn wir seine Argumentation etwas weiterentwickeln, ist es auch möglich, eine sehr gute Untergrenze zu berechnen:
Gegeben die Anzahl der Bits gibt es eine einzigartige so 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
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 dass
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:
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 .
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 .
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()