n個の記号のアルファベットがあるとします。文字列で効率的にエンコードできます。たとえば、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
これで、各列には最大で1に設定されたpビットが含まれるという追加の制約があります。たとえば、p = 2(およびn = 8)の場合、可能な解決策は次
のとおりです: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
nとpが与えられた場合、最適なエンコーディング(最短の長さ)を見つけるアルゴリズムはありますか?(そしてそれが最適解を計算することを証明することができますか?)
編集
これまでに、ビット数の下限を推定する2つのアプローチが提案されています 。このセクションの目標は、最良の回答の選択を説明するために、2つの回答の分析と比較を提供することです。
Yuvalのアプローチはエントロピーに基づいており、非常に優れた下限を提供します。 どこ 。
アレックスのアプローチは組み合わせ論に基づいています。彼の推論をもう少し発展させると、非常に優れた下限を計算することもできます。
与えられた ビット数 、ユニークな存在します そのような 最適なソリューションはすべてのビットが低いコードワードを使用し、次に1ビットが高い、2ビットが高い、...、kビットが高いコードワードを使用することを納得させることができます。以下のためエンコードに残りのシンボル、使用に最適であるコードワード全く明らかではないが、確かザ用各列の重みは、ビットの高さのコードワードのみを使用でき、場合よりも大きくなります(すべての。したがって、下限を
ここで、と、を推定してみます。ことがわかっているため、場合、ます。これはの下限を与えます。最初の計算次に最大の検索ように
これは、に対して2つの下限を一緒にプロットした場合に得られるものです。下限は緑色のエントロピーに基づいており、下限は上記の組み合わせ論に基づくもので、青色で取得されます。
どちらも非常によく似ています。ただし、2つの下限の差をプロットすると、特に値が小さい場合は、組み合わせ論的推論に基づく下限の方が全体的に優れていることは明らかです。
個々の座標が小さなと相関するようになるため、が小さくなると、不等式が弱くなるという事実から問題が発生すると思います。ただし、これは場合でも非常に優れた下限です。
以下は、下限の計算に使用されたスクリプト(python3)です。
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()