さもなければ、彼はあなたの家を吹き飛ばして吹き飛ばします!
それは完全に無関係でした。この挑戦は実際にハフマンコーディングについてです。その要点は、特定のテキスト内の文字の頻度を利用して、その表現を短くすることです。言い換えれば、私たちのアルファベットがa
通り抜けているz
としましょう。27文字です。5ビットには32文字分のスペースがあるため、それぞれを5ビットで一意にエンコードできます。ただし、多くの状況(英語や一般的な言語など)では、一部の文字は他の文字よりも頻繁に出現します。頻度の高い文字にはより少ないビットを使用し、頻度の低い文字には(おそらく)より多くのビットを使用できます。正しく実行すると、ビット数が全体的に節約され、元のテキストを一意に再構築できます。
「この質問はハフマンコーディングに関するものです」を例に取りましょう。このテキストの長さは37文字で、通常は37 * 8 = 296ビットですが、各文字に5ビットしか使用しない場合は37 * 5 = 185ビットのみです。心に留めておきます。
以下に、各文字とテキスト内のそれらの頻度の(ソート)テーブルを、頻度の高い順に並べています(_はスペースを表します)。
_ 5
i 4
n 3
o 3
s 3
t 3
u 3
a 2
f 2
h 2
b 1
c 1
d 1
e 1
g 1
m 1
q 1
関連する最適なコーディングは次のとおりです。
_ 101
i 011
n 1100
o 1101
s 1110
t 1111
u 001
a 10011
f 0001
h 0101
b 00000
c 00001
d 01000
e 01001
g 10000
m 10001
q 10010
これは、すべての文字に5ビットを使用するよりも優れたエンコーディングになることはすぐに明らかになるはずです。しかし、どれだけ良いかを調べましょう!
185 ビットと比較して145ビット!これは40ビットの節約、または20%を超える節約です!(もちろん、これは構造に関する情報がデコードに利用可能であることを前提としています。)このコーディングは、文字の表現を変更することでビットを落とすことができないため最適です。
タスク
- 1つのパラメーターを持つプログラムまたは関数を記述します...
- STDIN(または同等のもの)から、または単一の引数として入力を受け取ります。
- 周波数でソートされた文字を使用して、上記の最適なハフマンコーディングを出力します(周波数クラス内の順序は関係ありません)。
- 入力の文字は、ASCII範囲
32..126
と改行に制限されていると想定できます。 - 入力が10,000文字以下であると仮定することができます(理論的には、入力は無制限である必要があります)。
- コードはかなり速く終了するはずです。上記の例では、最悪でも1分程度しかかかりません。(これは、ブルートフォースを排除することを目的としています。)
- スコアリングはバイト単位です。
例
x
---
x 0
xxxxxxxxx
---
x 0
xxxxxxxxy
---
x 0
y 1 (these may be swapped)
xxxxxyyyz
---
x 0
y 10
z 11
uuvvwwxxyyzz
--- (or)
u 000 000
v 001 001
w 100 010
x 101 011
y 01 10
z 11 11
this question is about huffman coding
---
101
i 011
n 1100
o 1101
s 1110
t 1111
u 001
a 10011
f 0001
h 0101
b 00000
c 00001
d 01000
e 01001
g 10000
m 10001
q 10010
ハッピーコーディング!
この類似の質問は、この質問が重複しているという点であっても密接に関連していることに注意してください。しかし、メタに関するこれまでのコンセンサスは、古いものはこのものの複製と見なされるべきであるということです。
this question is about huffman coding
、ビット数を136ではなく145とカウントしました。