Python描述數(shù)據(jù)結(jié)構(gòu)學(xué)習(xí)之哈夫曼樹篇
前言
本篇章主要介紹哈夫曼樹及哈夫曼編碼,包括哈夫曼樹的一些基本概念、構(gòu)造、代碼實(shí)現(xiàn)以及哈夫曼編碼,并用Python實(shí)現(xiàn)。
1. 基本概念
哈夫曼樹

其中,
帶權(quán)路徑長度是帶權(quán)結(jié)點(diǎn)和根結(jié)點(diǎn)之間的路徑長度與該結(jié)點(diǎn)的權(quán)值的乘積。有關(guān)帶權(quán)結(jié)點(diǎn)、路徑長度的概念請(qǐng)參閱這篇博客。
對(duì)于含有
2. 構(gòu)造過程及實(shí)現(xiàn)
給定
比如

代碼實(shí)現(xiàn):
class HuffmanTreeNode(object): def __init__(self): self.data = '#' self.weight = -1 self.parent = None self.lchild = None self.rchild = None class HuffmanTree(object): def __init__(self, data_list): self.nodes = [] # 按權(quán)重從大到小進(jìn)行排列 for val in data_list: newnode = HuffmanTreeNode() newnode.data = val[0] newnode.weight = val[1] self.nodes.append(newnode) self.nodes = sorted(self.nodes, key=lambda node: node.weight, reverse=True) print([(node.data, node.weight) for node in self.nodes]) def CreateHuffmanTree(self): # 這里注意區(qū)分 # TreeNode = self.nodes[:] 變量TreeNode, 這個(gè)相當(dāng)于深拷貝, TreeNode變化不影響nodes # TreeNode = self.nodes 指針TreeNode與nodes共享一個(gè)地址, 相當(dāng)于淺拷貝, TreeNode變化會(huì)影響nodes TreeNode = self.nodes[:] if len(TreeNode) > 0: while len(TreeNode) > 1: letfTreeNode = TreeNode.pop() rightTreeNode = TreeNode.pop() newNode = HuffmanTreeNode() newNode.lchild = letfTreeNode newNode.rchild = rightTreeNode newNode.weight = letfTreeNode.weight + rightTreeNode.weight letfTreeNode.parent = newNode rightTreeNode.parent = newNode self.InsertTreeNode(TreeNode, newNode) return TreeNode[0] def InsertTreeNode(self, TreeNode, newNode): length = len(TreeNode) if length > 0: temp = length - 1 while temp >= 0: if newNode.weight < TreeNode[temp].weight: TreeNode.insert(temp+1, newNode) return True temp -= 1 TreeNode.insert(0, newNode)
3. 哈夫曼編碼
在數(shù)據(jù)通信時(shí),假如我們要發(fā)送
| A | B | C | D | E | F | G | |
|---|---|---|---|---|---|---|---|
| 固定長度編碼 | 000 | 001 | 010 | 011 | 100 | 101 | 110 |
| 可變長度編碼 | 0 | 1 | 01 | 10 | 11 | 101 | 110 |
報(bào)文最短可以引申到二叉樹路徑最短,即構(gòu)造前綴編碼的實(shí)質(zhì)就是構(gòu)造一棵哈夫曼樹,通過這種形式獲得的二進(jìn)制編碼稱為哈夫曼編碼。這里的權(quán)值就是報(bào)文中字符出現(xiàn)的概率,出現(xiàn)概率越高的字符我們用越短的字符表示。
以下表中的字符及其出現(xiàn)的概率為例來實(shí)現(xiàn)哈夫曼編碼:
| 字符 | A | B | C | D | E | F | G | H |
|---|---|---|---|---|---|---|---|---|
| 出現(xiàn)概率 | 0.01 | 0.43 | 0.15 | 0.02 | 0.03 | 0.21 | 0.07 | 0.08 |
| 哈夫曼編碼 | 101010 | 0 | 110 | 101011 | 10100 | 111 | 1011 | 100 |

代碼實(shí)現(xiàn)就是在哈夫曼樹的基礎(chǔ)上加一個(gè)編碼的函數(shù):
def HuffmanEncode(self, Root):
TreeNode = self.nodes[:]
code_result = []
for index in range(len(TreeNode)):
temp = TreeNode[index]
code_leaf = [temp.data]
code = ''
while temp is not Root:
if temp.parent.lchild is temp:
# 左分支
code = '0' + code
else:
# 右分支
code = '1' + code
temp = temp.parent
code_leaf.append(code)
code_result.append(code_leaf)
return code_result
測(cè)試結(jié)果如下:
if __name__ == '__main__':
tree_obj = HuffmanTree([('A', 0.01), ('B', 0.43), ('C', 0.15), ('D', 0.02), ('E', 0.03), ('F', 0.21), ('G', 0.07), ('H', 0.08)])
huf_tree = tree_obj.CreateHuffmanTree()
huf_code = tree_obj.HuffmanEncode(huf_tree)
for index in range(len(huf_code)):
print('{0}: {1}'.format(huf_code[index][0], huf_code[index][1]))

總結(jié)
到此這篇關(guān)于Python描述數(shù)據(jù)結(jié)構(gòu)學(xué)習(xí)之哈夫曼樹篇的文章就介紹到這了,更多相關(guān)Python數(shù)據(jù)結(jié)構(gòu)之哈夫曼樹內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Python 數(shù)據(jù)結(jié)構(gòu)之樹的概念詳解
- Python數(shù)據(jù)結(jié)構(gòu)之二叉排序樹的定義、查找、插入、構(gòu)造、刪除
- Python數(shù)據(jù)結(jié)構(gòu)之棧、隊(duì)列及二叉樹定義與用法淺析
- Python數(shù)據(jù)結(jié)構(gòu)之哈夫曼樹定義與使用方法示例
- Python數(shù)據(jù)結(jié)構(gòu)與算法之字典樹實(shí)現(xiàn)方法示例
- Python數(shù)據(jù)結(jié)構(gòu)與算法之完全樹與最小堆實(shí)例
- Python數(shù)據(jù)結(jié)構(gòu)與算法之二叉樹結(jié)構(gòu)定義與遍歷方法詳解
- Python數(shù)據(jù)結(jié)構(gòu)之樹的全面解讀
相關(guān)文章
python中字符串類型json操作的注意事項(xiàng)
這篇文章主要給大家介紹了python中字符串類型json操作的一些注意事項(xiàng),文中介紹的非常詳細(xì),對(duì)大家具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起看看吧。2017-05-05
Python緩存方案優(yōu)化程序性能提高數(shù)據(jù)訪問速度
Python緩存方案是一種優(yōu)化程序性能,提高數(shù)據(jù)訪問速度的方案。通過緩存數(shù)據(jù),可以減少重復(fù)的計(jì)算和IO操作,從而提高程序的運(yùn)行效率。Python中常用的緩存方案包括內(nèi)存緩存、磁盤緩存和分布式緩存等,根據(jù)實(shí)際需求選擇不同的方案可以幫助我們更好地優(yōu)化程序性能2023-05-05
python的numpy模塊安裝不成功簡單解決方法總結(jié)
這篇文章主要介紹了python的numpy模塊安裝不成功簡單解決方法總結(jié),分享了四種python模塊導(dǎo)入不成功的解決方法,具有一定借鑒價(jià)值,需要的朋友可以參考下。2017-12-12
python監(jiān)控進(jìn)程狀態(tài),記錄重啟時(shí)間及進(jìn)程號(hào)的實(shí)例
今天小編就為大家分享一篇python監(jiān)控進(jìn)程狀態(tài),記錄重啟時(shí)間及進(jìn)程號(hào)的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-07-07
將tf.batch_matmul替換成tf.matmul的實(shí)現(xiàn)
這篇文章主要介紹了將tf.batch_matmul替換成tf.matmul的實(shí)現(xiàn),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-06-06
Python訪問本地deepseek示例【含deepseek本地部署】
這篇文章主要介紹了Python訪問本地deepseek功能,結(jié)合實(shí)例形式分析了使用Ollama本地部署deepseek以及python訪問本地deepseek的過程,需要的朋友可以參考下2018-06-06
淺談tensorflow中dataset.shuffle和dataset.batch dataset.repeat注意點(diǎn)
這篇文章主要介紹了淺談tensorflow中dataset.shuffle和dataset.batch dataset.repeat注意點(diǎn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-06-06
windows 10下安裝搭建django1.10.3和Apache2.4的方法
最近發(fā)現(xiàn)很多教程都是在linux上搭建,windows上似乎天生不太適合,但是我還是愿意試試這個(gè)坑。下面這篇文章主要給大家介紹了在windows 10系統(tǒng)下安裝搭建django1.10.3和Apache2.4的方法,需要的朋友可以參考借鑒,下面來一起看看吧。2017-04-04

