哈夫曼树简略分析

哈夫曼树

图片名称

(发现编码特别长,由于每个字母出现的频率不一样,考虑用用短的编码表示出现频率高的字母,用长的编码表示出现频率低的字母,这样可以缩短编码的长度)

统计字母出现的频率:
图片名称

每次从集合中找2个频率最少的字母出来 ,用他们构成一个新结点,并入集合中。一直下去…
图片名称
出现次数多的离根结点近,出现次数少离根节点远。

解码:根据编码串中的字母,沿着哈夫曼树扫描,扫描到字母。接着扫描下一个字母。

对一个字符的编码是另一个字符编码的前缀,会出现歧义。
哈夫曼编码中,没有一个字符的编码是另一个字符编码的前缀。

WPL:

特点:

  • 权值越大的结点离根结点越近。
  • 树中没有度为1的结点。(没有单分支结点)这类树又叫做正则(严格)二叉树。
  • 树的带权路径长度最短

哈夫曼n叉树

构造哈夫曼3叉树:就是把每回选2个换成每回选3个。

不够3个结点,采取补权值为0结点的方式。
(显然0应该在最开始就串起来,因为这样0离根会较远,权值为0,就降低了带权路径)

### 哈夫曼实验代码的功能分析及优化建议 #### 功能分析 哈夫曼实验代码的核心功能包括以下几个方面: 1. **构建哈夫曼**: 构建哈夫曼的过程是通过贪心算法实现的。首先将所有字符及其频率作为叶子节点存入一个最小堆中,然后不断取出频率最小的两个节点,创建一个新的内部节点,其频率为这两个节点频率之和,并将新节点重新插入堆中[^1]。重复此过程直到堆中只剩下一个节点,即为哈夫曼的根节点。 2. **生成哈夫曼编码**: 生成哈夫曼编码的过程是从根节点到每个叶子节点的路径上记录下“0”或“1”,最终形成每个字符的编码表[^2]。左分支标记为“0”,右分支标记为“1”。 3. **编码与解码**: - **编码**:根据生成的哈夫曼编码表,将输入字符串中的每个字符替换为其对应的二进制编码。 - **解码**:从编码串开始,沿着哈夫曼的路径逐步查找,直到找到一个叶子节点,该叶子节点对应的字符即为解码结果。 4. **计算平均码长**: 平均码长的计算公式为: \[ L = \sum_{i=1}^{n} f_i \cdot l_i \] 其中 \(f_i\) 表示第 \(i\) 个字符的频率,\(l_i\) 表示第 \(i\) 个字符的编码长[^2]。 #### 优化建议 为了提高哈夫曼实验代码的效率和可读性,可以考虑以下优化措施: 1. **使用优先队列代替手动实现最小堆**: 在C++中可以使用 `std::priority_queue` 或在Python中使用 `heapq` 模块来简化最小堆的实现。这样可以减少代码量并提高代码的可维护性[^1]。 2. **动态内存管理**: 在C语言中,确保正确释放分配的内存以避免内存泄漏。例如,在递归生成编码时,使用栈而非递归调用可以减少内存开销[^1]。 3. **并行化处理**: 如果数据量较大,可以考虑使用多线程或多进程技术来加速哈夫曼的构建和编码生成过程[^2]。 4. **缓存机制**: 对于频繁使用的字符编码,可以将其缓存起来以减少重复计算的时间开销[^2]。 5. **改进编码存储方式**: 使用位操作直接将编码写入字节流,而不是逐字符存储,可以显著减少存储空间的需求[^1]。 ```python import heapq # 定义哈夫曼节点 class HuffmanNode: def __init__(self, char, freq): self.char = char self.freq = freq self.left = None self.right = None # 用于堆排序 def __lt__(self, other): return self.freq < other.freq # 构建哈夫曼 def build_huffman_tree(freq_map): heap = [] for char, freq in freq_map.items(): heapq.heappush(heap, HuffmanNode(char, freq)) while len(heap) > 1: left = heapq.heappop(heap) right = heapq.heappop(heap) merged = HuffmanNode(None, left.freq + right.freq) merged.left = left merged.right = right heapq.heappush(heap, merged) return heap[0] # 生成哈夫曼编码 def generate_huffman_codes(root, current_code, codes): if root is None: return if root.char is not None: codes[root.char] = current_code return generate_huffman_codes(root.left, current_code + "0", codes) generate_huffman_codes(root.right, current_code + "1", codes) # 编码函数 def encode(text, codes): encoded_text = "" for char in text: encoded_text += codes[char] return encoded_text # 解码函数 def decode(encoded_text, root): decoded_text = "" current_node = root for bit in encoded_text: if bit == &#39;0&#39;: current_node = current_node.left else: current_node = current_node.right if current_node.char is not None: decoded_text += current_node.char current_node = root return decoded_text # 示例 freq_map = {&#39;a&#39;: 5, &#39;b&#39;: 9, &#39;c&#39;: 12, &#39;d&#39;: 13, &#39;e&#39;: 16, &#39;f&#39;: 45} root = build_huffman_tree(freq_map) codes = {} generate_huffman_codes(root, "", codes) text = "abcdef" encoded_text = encode(text, codes) decoded_text = decode(encoded_text, root) print("Original Text:", text) print("Encoded Text:", encoded_text) print("Decoded Text:", decoded_text) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

jieshenai

为了遇见更好的文章

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值