博主自己手擼的**,若有有錯誤,感謝指出 直接上**目錄0 講義
0.1 二元字首碼
0.2 平均傳輸位數
0.3 偽碼
0.4 例項
**:計算平均位數
**:哈夫曼編碼
**:生成哈夫曼樹&主函式
哈夫曼編碼是資料結構常考知識點,對比以前c寫的**,python真的簡單易懂。
# 哈夫曼編碼, 計算平均位數
def huffmancode(root, tree, rootcode='', codedict={}, depth=1, res=0):
# 一般情況下 root =
# 對左子樹進行處理:如果是葉子節點,就列印編碼;否則遞迴
if len(root['left'][0]) == 1:
codedict[root['left'][0]] = '0'+ rootcode
res += (len(rootcode)+1) * root['left'][1] # 計算平均位數
else:
codedict, res = huffmancode(tree[root['left'][0]], tree, '0'+rootcode, codedict, depth+1, res)
# 對右子樹進行處理:如果是葉子節點,就列印編碼;否則遞迴
if len(root['right'][0]) == 1:
codedict[root['right'][0]] = '1'+ rootcode
res += (len(rootcode)+1) * root['right'][1] # 計算平均位數
else:
codedict, res = huffmancode(tree[root['right'][0]], tree, '1'+rootcode, codedict, depth+1, res)
return codedict, res
s = eval(input('若干字元:'))
w = eval(input('對應權重:'))
# 合併成乙個字典
arr = [[s[i],w[i]] for i in range(len(s))]
# [['a', 45], ['b', 13], ['c', 12], ['d', 16], ['e', 9], ['f', 5]]
tree = {}
while len(arr)>1:
# 1 根據權重排序
arr.sort(key=lambda x:x[1])
# 2 選出最小的兩個節點,分別作為左子樹,右子樹
l = arr[0] # 較小的作為左子樹
r = arr[1] # 較大者作為右子樹
if len(arr)>2:
tree[l[0]+r[0]] =
# 3 用新節點置換這兩個節點
arr = arr[2:]
else:
tree['root'] =
break
print('\n哈夫曼樹:',tree)
code, res = huffmancode(tree['root'], tree)
print('哈夫曼編碼:',code)
print('平均傳輸位數:',res/sum(w))
"""
若干字元:'a','b','c','d','e','f'
對應權重:45,13,12,16,9,5
哈夫曼樹: ,
'cb': ,
'fed': ,
'cbfed': ,
'root':
}哈夫曼編碼:
平均傳輸位數: 2.24
"""
貪心演算法之哈夫曼編碼
哈夫曼編碼簡介 舉例以及詳細說明 塊測試結果 二叉樹中有一種特別的樹 哈夫曼樹 最優二叉樹 其通過某種規則 權值 來構造出一哈夫曼二叉樹,在這個二叉樹中,只有葉子節點才是有效的資料節點 很重要 其他的非葉子節點是為了構造出哈夫曼而引入的!哈夫曼編碼是乙個通過哈夫曼樹進行的一種編碼,一般情況下,以字元...
貪心演算法 (哈夫曼編碼)HuffmanCode
哈夫曼編碼應用在於對於檔案的壓縮,壓縮效率是非常的高。實現哈夫曼編碼,得首先知道哈夫曼樹的形成過程是怎樣進行的 1 對於所要編碼的資料,首先得將它們中找到其中的最小的兩個位置合併成乙個小樹,節點的權值是兩者相加形成的 2 步驟1中得到的權值在進入原排列中,在此獲取新組合中的最小的兩個資料,在執行步驟...
哈夫曼編碼最優字首碼的貪心演算法
哈夫曼編碼是廣泛地用於資料檔案壓縮的十分有效的編碼方法。其壓縮率通常在20 90 之間。哈夫曼編碼演算法用字元在檔案 現的頻率表來建立乙個用0,1串表示各字元的最優表示方式。字首碼 對每乙個字元規定乙個0,1串作為其 並要求任一字元的 都不是其他字元 的字首。這種編碼稱為字首碼。編碼的字首性質可以使...