日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > python >内容正文

python

python哈夫曼树_python霍夫曼树

發(fā)布時間:2024/4/11 python 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python哈夫曼树_python霍夫曼树 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

class Node():

data=0

left=None

right=None

father=None

def __init__(self,data,left,right):

self.data=data

self.left=left

self.right=right

這里定義了一個Node類

聲明了左右結(jié)點和父節(jié)點,父節(jié)點是用來輸出霍夫曼編碼用的。

初始化構(gòu)造函數(shù),給數(shù)據(jù)和左右結(jié)點賦值,父節(jié)點不在這初始化,self的話和this關(guān)鍵字差不多

root=None

聲明根節(jié)點

def zhuanhuan( arr,index,n):

if index>=len(arr):

return None

else:

left=Node(arr[index],None,None)

num1=arr[index]+n.data

node=Node(num1,left,n)

left.father=node

n.father=node

if index==0:

index+=1

if index==len(arr)-1:

global root

root=node

zhuanhuan(arr,index+1,node)

這是一個轉(zhuǎn)換函數(shù),把數(shù)組轉(zhuǎn)化為霍夫曼樹,傳入的形參 arr是數(shù)組,index是下標(biāo),n是結(jié)點(定義結(jié)點是為了避免幾個結(jié)點斷節(jié))

如果index大于數(shù)組的長度,那么就退出

如果小于就繼續(xù)構(gòu)建霍夫曼樹

根據(jù)霍夫曼樹的構(gòu)建原理,傳入一個數(shù)組的值,把二者和的結(jié)點的傳入構(gòu)造函數(shù),遞歸,

left=Node(arr[index],None,None)

num1=arr[index]+n.data

node=Node(num1,left,n)

中間就是利用構(gòu)造函數(shù)初始化的代碼

left.father=node

n.father=node

把左右結(jié)點的父節(jié)點指向node

因為數(shù)組是從0開始到len(arr)-1

所以當(dāng)index滿足?if index==len(arr)-1:時

就定義一個全局root作為根節(jié)點

global? root

root=node

然后遞歸zhuanhuan(arr,index+1,node)

flag=False

v=[]

聲明一個標(biāo)志,定義一個bool型數(shù)組

for i in range(100):

v.append(False)

初始化100個False

輸出霍夫曼編碼函數(shù)

def show(n):

global flag 全局標(biāo)志

global arm 記錄個數(shù)的數(shù)組

global ard 記錄字符串不同的字符

if n!=None: 如果結(jié)點不為空

if (n.left==None and n.right==None)or flag==True://如果是葉子結(jié)點或者遍歷父節(jié)點

if v[n.data]!=True and(n.left==None and n.right==None)://如果葉子結(jié)點沒有輸出過

for i in range(len(arm))://把數(shù)字轉(zhuǎn)化為原來的字符碼比如a出現(xiàn)了4次那么在霍夫曼樹記錄的就是4,這個循環(huán)就是把4再轉(zhuǎn)化為a

if n.data==arm[i]:

print ard[i],":",

break

if n.father==None://如果父節(jié)點為空 那么就代表遍歷可以結(jié)束了

flag=False;

return

else://如果父節(jié)點不為空就繼續(xù)循環(huán)遍歷

flag=True標(biāo)志設(shè)為

show(n.father)//遍歷父節(jié)點

if n==n.father.right:如果是右子樹就輸出1

print 1," ",

else://如果是左子樹就輸出0

print 0," ",

else:如果不是葉子結(jié)點就遞歸遍歷霍夫曼樹

show(n.left)

show(n.right)

print "請輸入一段字符串:"

str=raw_input()

arr=[]#字符數(shù)組

arr=str

ard=[]//記錄有幾個不同字符的數(shù)組

for i in range(len(arr))://把不同的字符放入ard字符數(shù)組

flag=True

for j in range(len(ard)):

if ard[j]==arr[i]:

flag=False;

break

if flag!=False:

ard.append(arr[i])

arm=[]//權(quán)值數(shù)組

for i in range(len(ard))://更新權(quán)值

arm.append(0)

for i in range(len(arr)):

for j in range(len(ard)):

if arr[i]==ard[j]://每出現(xiàn)一次那個字符的權(quán)值層數(shù)組就自增1

arm[j]+=1;

break

for i in range(len(ard)-1)://插入排序

temp=ard[i+1]//記錄下一個數(shù)

temp1=arm[i+1]

j=i

while j>-1 and temp1

arm[j+1]=arm[j]

ard[j+1]=ard[j]

j-=1

arm[j+1]=temp1

ard[j+1]=temp

print

print "每一個元素的最小編碼為:",

zhuanhuan(arm,0,Node(arm[1],None,None))//把排序好的東西放入構(gòu)建霍夫曼樹

show(root)//遞歸輸出霍夫曼編碼

#生命本沒有意義,我們的存在就是賦予它意義

總結(jié)

以上是生活随笔為你收集整理的python哈夫曼树_python霍夫曼树的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。