国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

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

2020-02-22 23:48:58
字體:
來源:轉載
供稿:網友

本文實例講述了Python數據結構之哈夫曼樹定義與使用方法。分享給大家供大家參考,具體如下:

HaffMan.py

#coding=utf-8#考慮權值的haff曼樹查找效率并非最高,但可以用于編碼等使用場景下class TreeNode:  def __init__(self,data):    self.data=data    self.left=None    self.right=None    self.parent=Noneclass HaffTree:  def __init__(self):    self.root=None  def set_root(self,rootNode):    self.root=rootNode  def run(self,lis):    i=0    lis=[[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 lis:      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])    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)          node = 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-8from HaffMan import HaffTreetree=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)            
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 教育| 沐川县| 桂东县| 周至县| 华宁县| 竹北市| 墨竹工卡县| 山丹县| 巴塘县| 响水县| 东兰县| 礼泉县| 丹棱县| 威远县| 大新县| 偃师市| 兴山县| 临漳县| 乌海市| 务川| 嵊泗县| 桑日县| 通河县| 佳木斯市| 武汉市| 广汉市| 体育| 连云港市| 甘洛县| 辰溪县| 开阳县| 上饶市| 昆山市| 洮南市| 特克斯县| 湟源县| 丰县| 木兰县| 延吉市| 桃源县| 米脂县|