制約付きバイナリコード


7

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 log2n







これで、各には最大で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つのアプローチが提案されています m。このセクションの目標は、最良の回答の選択を説明するために、2つの回答の分析と比較を提供することです。

Yuvalのアプローチはエントロピーに基づいており、非常に優れた下限を提供します。lognh(p/n) どこ h(x)=xlogx+(1x)log(x)

アレックスのアプローチは組み合わせ論に基づいています。彼の推論をもう少し発展させると、非常に優れた下限を計算することもできます。

与えられた m ビット数 log2(n)、ユニークな存在します kそのような 最適なソリューションはすべてのビットが低いコードワードを使用し、次に1ビットが高い、2ビットが高い、...、kビットが高いコードワードを使用することを納得させることができます。以下のためエンコードに残りのシンボル、使用に最適であるコードワード全く明らかではないが、確かザ用各列の重みは、ビットの高さのコードワードのみを使用でき、場合よりも大きくなります(すべての。したがって、下限を

1+(m1)+...+(mk)<n1+(m1)+...+(mk)+(mk+1
n1メートル1メートルkwk+1|wiwj|1i,jp=max(wi)
pm=0+1+(m12)+...+(m1k1)+(n1(m1)...(mk))(k+1)m

ここで、と、を推定してみます。ことがわかっているため、場合、ます。これはの下限を与えます。最初の計算次に最大の検索ようにnpmpmpp<pmm<mmpmmp<pm

これは、に対して2つの下限を一緒にプロットした場合に得られるものです。下限は緑色のエントロピーに基づいており、下限は上記の組み合わせ論に基づくもので、青色で取得されます。n=1000ここに画像の説明を入力してください

どちらも非常によく似ています。ただし、2つの下限のをプロットする、特に値が小さい場合は、組み合わせ論的推論に基づく下限の方が全体的に優れていることは明らかです。p

ここに画像の説明を入力してください

個々の座標が小さなと相関するようになるため、が小さくなると、不等式が弱くなるという事実から問題が発生すると思います。ただし、これは場合でも非常に優れた下限です。H(X)H(Xi)ppp=Ω(n)

以下は、下限の計算に使用されたスクリプト(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()

1
@DW制約はあなたの状態と全く同じです。列には、最大で1に設定されたpビットが含まれている必要があります。選択したすべてのキーの各位置のビット1は、pを超えません。しかし、最初のステップは、各ビット幅の容量を数えることです。
Terence Hang

user3017842、私はあなたの最新の編集が自己回答として投稿されるべきだと思います。あなたの質問への答えとしてそれは単独で立っていると思います。同意しますか?もしそうなら、それのための正しい場所は質問ではなく回答ボックスにあります-これはこれに出くわす将来の読者にとってはるかに理にかなっています(そしてコミュニティがあなたの回答に投票することもできます)。あなたが行った分析を共有していただきありがとうございます。ありがとうございました。その資料を回答として投稿し、それを質問から削除することをお勧めします。どう思いますか?それはあなたにとって理にかなっているように見えますか?
DW

@DW EDITセクションは、最良の回答の選択を説明するために、2つの提案された回答を比較するだけです。したがって、私はそれを自己回答にしたくありませんでした。しかし、将来のユーザーにとっては明確さが欠けていることに完全に同意するため、セクションの目的を明確にし、対応する回答へのリンクを提供しました。今はもう少しはっきりしていると思います。
user3017842

回答:


3

作成できる追加の下限があります。これは、@ user3017842がYuvalの回答に関するコメントで述べたようなケースに対処します。(ここでのケースp 特に小さいです。) m すでに:次に pmすべてのコードワード全体で高ビットの合計。私たちは興味があるのでp小さいので、これらの上位ビットを制限リソースと見なし、それを使用してコードを構築したいと考えています(また、取得できるコードワードの数を確認します)。すべて0のコードワードを1つ持つことができます。m 1のコードワード (m2) 1を2つ持つなど。コードワードの最大ビット数を呼び出す場合 k、その後

pm=01+1m+2(m2)+...iki(mi)
コードワードの数は n 同様に、
nik(mi)
ケースを見てみると pm、その後 k2最初の不等式はすでに暗示されています。(pm=m2=m+2(m2))。したがって、コードは0-語、 m シングル-1-単語、および (p1)m/2 二-1-単語。したがって
n1+m+(p1)m/2
または反転
m2(n1)p+1.
これにより、 m5 あなたが提供する例では、前に述べたように、おそらく非常に役立つでしょう pm (または pn)。

1
あなたの答えが勝つ理由を確認するには、メインの投稿の編集セクションをご覧ください!
user3017842

4

これは、少なくとも一部の範囲のパラメータについて、下限と漸近的に一致する構成です。表記m 列の数、そして簡単にするために、 pn/2

下限から始めます m。しましょうXランダムに一様に選択されたシンボルのエンコーディング。しましょうX1,,Xm 個別の座標にして、 wip の重さ i番目の列。その後

logn=H(X)i=1mH(Xi)=i=1mh(wi/n)mh(p/n).
したがって
mlognh(p/n).
ここに H 確率変数のエントロピーです H(X)=xPr[X=x]logPr[X=x] そして h エントロピー関数です h(x)=xlogx(1x)log(1x)。(任意の対数の底を使用できます。)

漸近的に一致する構造、それはうまくいくはずです p=Ω(n)、選択 m この下限より少し大きく、ランダムなエンコーディングスキームを選択します。各ビットは 1 ある程度の確率で q/n これは少し小さいです p/n。パラメータを正しく選択すると、これにより有効なエンコーディングが得られるはずです(すべてのコードワードが異なり、すべての列の重みが最大でp)正の確率。


ニースの下限。なぜ一致する建設がうまくいくのかp=Ω(n)?無効なエンコーディングを取得する確率を制限する以外に、それを信じる簡単な方法はありますかm下限近くでピックされていますか?
アリエル

経験上、動作する可能性は高いと言われていますが、やってみないと分からないです。
Yuval Filmus

この下限は、個々の座標が X1,X2,...,Xm 実質的に独立しています(不平等のため H(X)H(Xi)平等に近くなります)。これは、p に十分近い n/2。しかしいつp小さいままですが、これはもう当てはまりません。たとえば、次のような極端なケースを考えますp=1
user3017842

1
いつ p=1 ビット数が n1(アレックス・メイバーグの回答で示唆されているように)。しかしながらn1lognh(p/n))n/logn。下限は不正確になりますp 小さいまま n大きくなっています。その上、小さいためp といった p=1、よく知られている誕生日の問題のため、提案された構造はあまりうまく機能しません。しかし、それでもなお、これは非常に優れたアプローチです。特にp=Ω(n)
user3017842 2015

私は、別の答えで提案された組み合わせ論的推論から推定された別の下限と比較しました。特にあなたの下限がわずかに弱いことが判明しましたp小さくなります。メインポストの編集セクションで比較の詳細を参照してください。それにもかかわらず、私はあなたの解決策に非常に感銘を受けました!よろしくお願いします!
user3017842 2015

0

これは簡単な検索方法です。ビット数の下限から始めて、正当なエンコーディングを見つけようとします。具体的には。

mを現在のビット数とします。シンボルiをbi1、bi2、...、bimとしてエンコードします。

制約:bi xor bjが0ではない-つまり、各シンボルのエンコーディングは一意です。

すべてのjの場合:sum_i bij <= p。

これは、疑似ブールの充足可能性の問題です(標準の充足可能性の問題として簡単にエンコードできます)。したがって、満足できる値が見つかるまでmを増やし続けます(または、下限と上限を使用してバイナリ検索を実行し、最小のmを見つけます)。

もちろん、これは実際に最小のmを実際に見つけることができることを保証するものではなく、SATチェックがタイムアウトする可能性があります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.