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...