Python アルゴリズム設計 - ハフマンコーディング

1. ハフマンツリー

ここに画像の説明を挿入

上の図は、「これはハフマン木の例です」で得られた文字頻度に基づいて構築されたハフマン木です。

2. ハフマン符号化

長年にわたり、ハフマン符号化は統計データ圧縮において非常に進歩してきましたが、その主な理由は、算術符号化が特許取得済みのハフマン符号化のアイデアと

Samuel Morse (サミュエル モールス) の考え方に非常に似ているためである可能性があることに注意する必要があります。データのまばらな表現が作成されます

が、モールス符号とは異なり、ハフマン符号には区切り文字が不要な固有のプレフィックスがあり、結果として得られるコードをデコードする方法は 1 つだけです。しかし、彼の欠点は、ほんの 1 ビットのエラーがメッセージの残りの部分を簡単に破壊してしまうことです。

3. Pythonアルゴリズムの実装


from collections import Counter

def find_min(freq):
    item = min(freq, key=lambda i: i[0])
    freq.remove(item)
    return item
def print_codes(tree, prefix=''):
    if isinstance(tree, tuple):
        print_codes(tree[0], prefix + '0')
        print_codes(tree[1], prefix + '1')
    else:
        print(tree, prefix)
def huffman_codes(text):
    freq = [(i, x) for x, i in Counter(text).items()]
    while len(freq) > 1:
        li, lx = find_min(freq)
        ri, rx = find_min(freq)
        freq.append((li + ri, (lx, rx)))
    print_codes(freq.pop()[1])


huffman_codes('The reason why Mr. chen can succeed is that  he is not only handsome but also wise')

:

  • min() メソッドは、指定されたパラメーターの最小値を返します。これはシーケンスにすることができます。

  • lambda 関数は匿名関数とも呼ばれ、lambda を使用すると関数を定義する手間が省け、コードを効率化できます。

  • isinstance(object, classinfo) 関数は、type() と同様に、オブジェクトが既知の型であるかどうかを判断します
    ここで、 object はインスタンス オブジェクトを表し、 classinfo は直接または間接のクラス名、基本型 ()、またはそれらから構成されるタプルを表します。tuple はタプルを表します。戻り値はbool型です

  • Counter はカウントに使用されます。これを呼び出すと、キーがリストで、その値が値の特定の番号であるオブジェクトが返されます。 items() 関数は、(キー, 値) タプルの走査可能な配列をリストとして返します。

出力結果は
ここに画像の説明を挿入

図のようになります。ハフマン符号化はバイナリ形式で出現するすべての文字を置き換えることができるため、情報を暗号化できます。

4. 著者情報

著者: Xiaohong の釣りルーティン、目標: プログラミングをもっと面白くする!

アルゴリズム、爬虫類、ゲーム開発、データ分析、自然言語処理、AI などに焦点を当てます。ご注目をお待ちしております。一緒に成長し、コーディングしましょう!

著作権に関する注意: この記事は盗作と転載を禁止しており、侵害があれば調査する必要があります。

おすすめ

転載: blog.csdn.net/qq_44000141/article/details/130309289