Huffman coding python實(shí)現(xiàn)

python實(shí)現(xiàn)的Huffman coding,給26個英文字母編碼请垛,inspired by Dave. 他只給出了Huffman tree的構(gòu)建步清,并將walk_tree留給了提問者自己完成辆它。我將walk_tree實(shí)現(xiàn)了一下并輸出結(jié)果,做個記錄堡赔,也順便分享給有需要的同學(xué)。

import queue

class HuffmanNode(object):
    def __init__(self, left=None, right=None, root=None):
        self.left = left
        self.right = right
    def children(self):
        return((self.left, self.right))

freq = [
    (8.167, 'a'), (1.492, 'b'), (2.782, 'c'), (4.253, 'd'),
    (12.702, 'e'),(2.228, 'f'), (2.015, 'g'), (6.094, 'h'),
    (6.966, 'i'), (0.153, 'j'), (0.747, 'k'), (4.025, 'l'),
    (2.406, 'm'), (6.749, 'n'), (7.507, 'o'), (1.929, 'p'), 
    (0.095, 'q'), (5.987, 'r'), (6.327, 's'), (9.056, 't'), 
    (2.758, 'u'), (1.037, 'v'), (2.365, 'w'), (0.150, 'x'),
    (1.974, 'y'), (0.074, 'z') ]

def create_tree(frequencies):
    p = queue.PriorityQueue()
    for value in frequencies:    # 1. Create a leaf node for each symbol
        p.put(value)             #    and add it to the priority queue
    while p.qsize() > 1:         # 2. While there is more than one node
        l, r = p.get(), p.get()  # 2a. remove two highest nodes
        node = HuffmanNode(l, r) # 2b. create internal node with children
        p.put((l[0]+r[0], node)) # 2c. add new node to queue      
    return p.get()               # 3. tree is complete - return root node

node = create_tree(freq)

#=================== 以上是Dave提供的思路  ==================
# 樹里的每一個節(jié)點(diǎn)是一個tuple设联,node[0]是頻率善已,node[1]是HuffmanNode 或者 character
# 下面是我的實(shí)現(xiàn)
def walk_tree(node, prefix="", code={}):
    """
    node 是一個tuple(freq, HuffmanNode|character)
    """
    if isinstance(node[1], HuffmanNode): # node[1]是一個HuffmanNode
        code1 = walk_tree(node[1].left, '0', code.copy()) # 這里如果直接傳入code會出錯
        code2 = walk_tree(node[1].right, '1', code.copy())
        if len(code1) > 0:
            for k, v in code1.items():
                code[k] = prefix + v
        if len(code2) > 0:
            for k, v in code2.items():
                code[k] = prefix + v
    else: # node[1]是一個字符
        code[node[1]] = prefix
    return(code) 

code = walk_tree(node) 
# 輸出每個字母的編碼
for i in sorted(freq, reverse=True):
    try:
        print(i[1], '{:6.2f}'.format(i[0]), code[i[1]])
    except Exception as e:
        print(e)
        continue

結(jié)果如下:

e  12.70 100
t   9.06 000
a   8.17 1110
o   7.51 1101
i   6.97 1011
n   6.75 1010
s   6.33 0111
h   6.09 0110
r   5.99 0101
d   4.25 11111
l   4.03 11110
c   2.78 01001
u   2.76 01000
m   2.41 00111
w   2.37 00110
f   2.23 00100
g   2.02 110011
y   1.97 110010
p   1.93 110001
b   1.49 110000
v   1.04 001010
k   0.75 0010111
j   0.15 001011011
x   0.15 001011010
q   0.10 001011001
z   0.07 001011000
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市离例,隨后出現(xiàn)的幾起案子换团,更是在濱河造成了極大的恐慌,老刑警劉巖宫蛆,帶你破解...
    沈念sama閱讀 222,104評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件艘包,死亡現(xiàn)場離奇詭異,居然都是意外死亡耀盗,警方通過查閱死者的電腦和手機(jī)想虎,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來叛拷,“玉大人舌厨,你說我怎么就攤上這事》揶保” “怎么了邓线?”我有些...
    開封第一講書人閱讀 168,697評論 0 360
  • 文/不壞的土叔 我叫張陵淌友,是天一觀的道長。 經(jīng)常有香客問我骇陈,道長震庭,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,836評論 1 298
  • 正文 為了忘掉前任你雌,我火速辦了婚禮器联,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘婿崭。我一直安慰自己拨拓,他們只是感情好谋竖,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,851評論 6 397
  • 文/花漫 我一把揭開白布暂雹。 她就那樣靜靜地躺著,像睡著了一般罢猪。 火紅的嫁衣襯著肌膚如雪授瘦。 梳的紋絲不亂的頭發(fā)上醋界,一...
    開封第一講書人閱讀 52,441評論 1 310
  • 那天,我揣著相機(jī)與錄音提完,去河邊找鬼形纺。 笑死,一個胖子當(dāng)著我的面吹牛徒欣,可吹牛的內(nèi)容都是我干的逐样。 我是一名探鬼主播,決...
    沈念sama閱讀 40,992評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼打肝,長吁一口氣:“原來是場噩夢啊……” “哼脂新!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起粗梭,我...
    開封第一講書人閱讀 39,899評論 0 276
  • 序言:老撾萬榮一對情侶失蹤戏羽,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后楼吃,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體始花,經(jīng)...
    沈念sama閱讀 46,457評論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,529評論 3 341
  • 正文 我和宋清朗相戀三年孩锡,在試婚紗的時候發(fā)現(xiàn)自己被綠了酷宵。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,664評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡躬窜,死狀恐怖浇垦,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情荣挨,我是刑警寧澤男韧,帶...
    沈念sama閱讀 36,346評論 5 350
  • 正文 年R本政府宣布朴摊,位于F島的核電站,受9級特大地震影響此虑,放射性物質(zhì)發(fā)生泄漏甚纲。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,025評論 3 334
  • 文/蒙蒙 一朦前、第九天 我趴在偏房一處隱蔽的房頂上張望介杆。 院中可真熱鬧,春花似錦韭寸、人聲如沸春哨。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,511評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽赴背。三九已至,卻和暖如春晶渠,著一層夾襖步出監(jiān)牢的瞬間凰荚,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,611評論 1 272
  • 我被黑心中介騙來泰國打工乱陡, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人仪壮。 一個月前我還...
    沈念sama閱讀 49,081評論 3 377
  • 正文 我出身青樓憨颠,卻偏偏與公主長得像,于是被迫代替她去往敵國和親积锅。 傳聞我的和親對象是個殘疾皇子爽彤,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,675評論 2 359

推薦閱讀更多精彩內(nèi)容

  • huffman編碼簡介 參考 這篇文章 python實(shí)現(xiàn) 開頭 二叉樹類 定義裝飾器用于計時 定義huffman類...
    loser_king閱讀 692評論 0 0
  • 可以看我的博客 lmwen.top 或者訂閱我的公眾號 簡介有稍微接觸python的人就會知道,python中...
    ayuLiao閱讀 3,124評論 1 5
  • 個人筆記缚陷,方便自己查閱使用 Py.LangSpec.Contents Refs Built-in Closure ...
    freenik閱讀 67,715評論 0 5
  • 字符集和編碼簡介 在編程中常呈矢荩可以見到各種字符集和編碼,包括ASCII,MBCS,Unicode等字符集箫爷。確切的說...
    蘭山小亭閱讀 8,510評論 0 13
  • 我誤打誤撞闖入了一個游戲世界嚷节,好不容易摸清楚了是怎么回事,我在行進(jìn)的路途中碰見了一幫土匪虎锚,土匪看到我那可是又驚...
    欲求眾生閱讀 401評論 0 1