哈夫曼编码python
一、什么是哈夫曼编码?
哈夫曼编码(Huffman Coding)是一种可变长度编码(Variable Length Code),它可以将不同长度的字符编码成等长的二进制串,从而实现数据压缩的目的。哈夫曼编码是由David A. Huffman在1952年发明的,它是一种贪心算法,可以得到最优解。
二、哈夫曼编码原理
1.字符频率统计
在进行哈夫曼编码之前,需要先统计每个字符出现的频率。通常使用一个字典来存储每个字符和其出现的次数。
二叉树的遍历python2.构建哈夫曼树
根据字符出现频率构建一个二叉树,其中频率越高的字符离根节点越近。构建过程中需要用到一个优先队列(Priority Queue),将每个节点按照频率大小加入队列中,并将队列中前两个
节点合并为一个新节点,并重新加入队列中。重复这个过程直到只剩下一个节点,即根节点。
3.生成哈夫曼编码
从根节点开始遍历哈夫曼树,在遍历过程中,左子树走0,右子树走1,直到叶子节点。将路径上经过的0和1分别表示为0和1位二进制数,并把这些二进制数拼接起来,就得到了该字符的哈夫曼编码。
三、哈夫曼编码Python实现
下面是一个简单的Python实现:
1.字符频率统计
```python
from collections import Counter
def get_char_frequency(text):
    """统计每个字符出现的频率"""
    return Counter(text)
```
2.构建哈夫曼树
```python
import heapq
class HuffmanNode:
    def __init__(self, char=None, freq=0, left=None, right=None):
        self.char = char
        self.freq = freq
        self.left = left
        self.right = right
   
    def __lt__(self, other):
        return self.freq < other.freq
   
def build_huffman_tree(char_freq):
    """根据字符频率构建哈夫曼树"""
    nodes = [HuffmanNode(char=c, freq=f) for c, f in char_freq.items()]
    heapq.heapify(nodes)
   
    while len(nodes) > 1:
        node1 = heapq.heappop(nodes)
        node2 = heapq.heappop(nodes)
        new_node = HuffmanNode(freq=node1.freq+node2.freq, left=node1, right=node2)
        heapq.heappush(nodes, new_node)
       
    return nodes[0]
```
3.生成哈夫曼编码
```python
def generate_huffman_codes(node, code="", codes={}):
    """生成哈夫曼编码"""
    if node is None:
        return
   
    if node.char is not None:
        codes[node.char] = code
   
    generate_huffman_codes(node.left, code+"0", codes)
    generate_huffman_codes(node.right, code+"1", codes)