出現頻率越高的字元編碼的長度越短
統計字元(詞)頻率,例如
依次將頻數最小的兩個根節點合併,新的根節點記錄兩個子節點的頻數和
計算每個葉子節點的 huffman 編碼
從根節點向葉子節點的路徑等價於編碼,左右兩條邊分別代表 0 和 1,則如上圖所示的編碼樹,各個葉子節點的編碼如下
a 001
b 0000
c 0001
d 010
e 011
f 1
實現的時候可以使用抽象資料結構——優先佇列
from collections import defaultdict
defhuffmanencode
(characterfrequency)
: heap =
[[freq,
[sym,""]
]for sym, freq in
list
(characterfrequency.items())
] heapify(heap)
while
len(heap)
>1:
for pair in lo[1:
]:pair[1]
='0'
+ pair[1]
for pair in hi[1:
]:pair[1]
='1'
+ pair[1]
[lo[0]
+ hi[0]
]+ lo[1:
]+ hi[1:
])return
sorted[1
:], key=
lambda p:
(len
(p[-1]
), p)
)
inputtext =
"this is an example for huffman encoding"
characterfrequency = defaultdict(
int)
for character in inputtext:
characterfrequency[character]+=1
huffcodes = huffmanencode(characterfrequency)
print
("symbol\tfrequency\thuffman code"
)for p in huffcodes:
print
("%s\t\t\t%s\t\t\t%s"
%(p[0]
, characterfrequency[p[0]
], p[1]
))'''symbol frequency huffman code
6 101
n 4 010
a 3 1001
e 3 1100
f 3 1101
h 2 0001
i 3 1110
m 2 0010
o 2 0011
s 2 0111
g 1 00000
l 1 00001
p 1 01100
r 1 01101
t 1 10000
u 1 10001
x 1 11110
c 1 111110
d 1 111111
'''
python資料結構與演算法
coding utf 8 import sys 使用以下語句將引數的str格式轉換為int格式 l list map int sys.argv 1 split target int sys.argv 2 def binarysearch print l print target left 0 rig...
資料結構與演算法 python
元類 基礎 冒泡 它重複地走訪要排序的數列,一次比較兩個元素,如果他們的順序錯誤就把他們交換過來。走訪數列的工作是重複地進行直到沒有再需要交換,也就是說該數列已經排序完成。這個演算法的名字由來是因為越小的元素會經由交換慢慢 浮 到數列的頂端,故名氣泡排序。def bubble sort alist ...
python演算法與資料結構
若n1 n2 n3 1000,且n1平方 n2平方 n3平方 n1,n2,n3為自然數 求出所有n1 n2 n3可能的組合?n1 0 n2 0 n3 0 判斷n1 n2 n3是否等於1000,之後變n3 1,n3 2,n3 3,然後再變n2 那如果變為 n1 n2 n3 2000 了呢?思路1 實現...