演算法 貪心演算法 哈夫曼編碼 python

2021-10-05 17:36:57 字數 2263 閱讀 4866

博主自己手擼的**,若有有錯誤,感謝指出  直接上**

目錄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串作為其 並要求任一字元的 都不是其他字元 的字首。這種編碼稱為字首碼。編碼的字首性質可以使...