python 資料結構與演算法 Huffman編碼

2021-10-02 04:29:44 字數 1865 閱讀 4938

出現頻率越高的字元編碼的長度越短

統計字元(詞)頻率,例如

依次將頻數最小的兩個根節點合併,新的根節點記錄兩個子節點的頻數和

計算每個葉子節點的 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 實現...