Python資料結構之哈夫曼樹定義與使用方法示例

2022-09-28 18:36:11 字數 3002 閱讀 6797

haffman.py

#coding=utf-8

#考慮權值的haff曼樹查詢效率並非最高,但可以用於編碼等使用場景下

class treenode:

def __init__(self,data):

self.data=data

self.left=none

self.right=none

self.parent=none

class hafftree:

def __init__(self):

self.root=none

def set_root(self,rootnode):

self.root=rootnode

def run(self,lis):

i=0lis=[[lis[j][0],lis[j][1],treenode(lis[j][1])]for j in range(len(lis))]

while len(lis)>1:

i+=1

lis=sorted(lis)

name='n'+str(i)

temp=treenode(name)

#結果與大話資料結構書上略有不同 因為lis[0][2]=lis[1][2] 無影響

#這裡使用parent 替代深度優先/廣度優先 演算法

temp.left=lis[0][2]

temp.right=lis[1][2]

lis[0][2].parent=temp

lis[1][2].parent=temp

#print lis[0][0],lis[1][0],len(lis)

value=lis[0][0]+lis[1][0]

lis=lis[1:]

lis[0]=[value,name,temp]

#print temp.data,temp.left.data,temp.right.data

self.set_root(temp)

def code(self,lis):

self.codelist=

stack=

node=self.root

stack.append(node)

res=

while(stack):

node=stack.pop()

res.append(node)

if node.right:

stack.append(node.right)

if node.left:

stack.append(node.left)

for li in vuguhhublis:

codel=

for re in res:

if re.data==li[1]:

parent=re

print '\n',parent.data,

codel.append(parent)

while parent.parent:

parent=parent.parent

print parent.data,

codel.append(parent)

codell=[int(codel[len(codel)-2-i]==codel[len(codel)-1-i].right) for i in range(len(codel)-1)]

self.codelist.append([li[1],codell])

www.cppcns.com return self.codelist

def list_all(self,method):

lis=

res=

if method=='before':

node=self.root

lis.append(node)

while(lis):

程式設計客棧node=lis[-1]

lis=lis[:-1]

if node:

res.append(node.data)

if node.right:

lis.append(node.right)

if node.left:

lis.append(node.left)

elif method=='mid':

node = self.root

while lis or node:

while node:

lis.append(node)

vuguhhubnowww.cppcns.comde = node.left

if len(lis)>0:

node = lis[-1]

lis=lis[:-1]

if node:

res.append(node.data)

node= node.right

else:

pass

return res

haffmantest.py

#coding=utf-8

from haffman import hafftree

tree=hafftree()

lis=[

[5,'a'],

[15,'b'],

[40,'c'],

[30,'d'],

[10,'e'],

]print lis[2:]

print sorted(lis)

tree.run(lis)

print tree.list_all('before')

#應用 haffman編碼,比如字母分布不均勻的情況下比較適合,可減少傳輸的資訊量(二進位制),不會出現干涉。:

tree=hafftree()

lis2=[

[27,'a'],

[8,'b'],

[15,'c'],

[15,'d'],

[30,'e'],

[5,'f'],

]tree.run(lis2)

print tree.code(lis2)

執行結果:

資料結構之哈夫曼樹

現在,我們經常會使用壓縮和解壓縮軟體來處理文件,因為它除了可以減少文件在磁碟上的空間外,還有重要的一點,就是我們可以在網路上一壓縮的形式傳輸大量資料,是的儲存和傳遞都更加高效。那麼壓縮而不出錯是如何做到的呢?簡單說,就是把我們要壓縮的文字進行重新編碼,今天我們就介紹一種最基本的壓縮編碼方法 哈夫曼編...

資料結構 哈夫曼樹 哈夫曼編碼

哈夫曼樹又稱最優樹 二叉樹 是一類帶權路徑最短的樹。構造這種樹的演算法最早是由哈夫曼 huffman 1952年提出,這種樹在資訊檢索中很有用。結點之間的路徑長度 從乙個結點到另乙個結點之間的分支數目。樹的路徑長度 從樹的根到樹中每乙個結點的路徑長度之和。結點的帶權路徑長度 從該結點到樹根之間的路徑...

哈夫曼編碼 哈夫曼樹 (資料結構)

哈夫曼編碼,又稱霍夫曼編碼,是一種編碼方式,哈夫曼編碼是可變字長編碼 vlc 的一種。huffman於1952年提出一種編碼方法,該方法完全依據字元出現概率來構造異字頭的平均長度最短的碼字,有時稱之為最佳編碼,一般就叫做huffman編碼 有時也稱為霍夫曼編碼 include include inc...