头歌实践教学平台答案数据结构赫夫曼树及其应用(代码补充,选作)

时间: 2023-11-17 12:04:11 浏览: 109
赫夫曼树是一种带权路径长度最短的树,常用于数据压缩和编码。下面是一个Python实现赫夫曼树的例子: ```python import heapq from collections import defaultdict class HuffmanCoding: def __init__(self, text): self.text = text self.heap = [] self.codes = {} self.reverse_mapping = {} class HeapNode: 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 __eq__(self, other): if(other == None): return False if(not isinstance(other, HeapNode)): return False return self.freq == other.freq def make_frequency_dict(self): frequency = defaultdict(int) for char in self.text: frequency[char] += 1 return frequency def make_heap(self, frequency): for key in frequency: node = self.HeapNode(key, frequency[key]) heapq.heappush(self.heap, node) def merge_nodes(self): while(len(self.heap)>1): node1 = heapq.heappop(self.heap) node2 = heapq.heappop(self.heap) merged = self.HeapNode(None, node1.freq + node2.freq) merged.left = node1 merged.right = node2 heapq.heappush(self.heap, merged) def make_codes_helper(self, root, current_code): if(root == None): return if(root.char != None): self.codes[root.char] = current_code self.reverse_mapping[current_code] = root.char return self.make_codes_helper(root.left, current_code + "0") self.make_codes_helper(root.right, current_code + "1") def make_codes(self): root = heapq.heappop(self.heap) current_code = "" self.make_codes_helper(root, current_code) def get_encoded_text(self): encoded_text = "" for char in self.text: encoded_text += self.codes[char] return encoded_text def pad_encoded_text(self, encoded_text): extra_padding = 8 - len(encoded_text) % 8 for i in range(extra_padding): encoded_text += "0" padded_info = "{0:08b}".format(extra_padding) encoded_text = padded_info + encoded_text return encoded_text def get_byte_array(self, padded_encoded_text): if(len(padded_encoded_text) % 8 != 0): print("Encoded text not padded properly") exit(0) b = bytearray() for i in range(0, len(padded_encoded_text), 8): byte = padded_encoded_text[i:i+8] b.append(int(byte, 2)) return b def compress(self): frequency = self.make_frequency_dict() self.make_heap(frequency) self.merge_nodes() self.make_codes() encoded_text = self.get_encoded_text() padded_encoded_text = self.pad_encoded_text(encoded_text) b = self.get_byte_array(padded_encoded_text) return b def remove_padding(self, padded_encoded_text): padded_info = padded_encoded_text[:8] extra_padding = int(padded_info, 2) padded_encoded_text = padded_encoded_text[8:] encoded_text = padded_encoded_text[:-1*extra_padding] return encoded_text def decode_text(self, encoded_text): current_code = "" decoded_text = "" for bit in encoded_text: current_code += bit if(current_code in self.reverse_mapping): character = self.reverse_mapping[current_code] decoded_text += character current_code = "" return decoded_text def decompress(self, compressed_data): bit_string = "" for byte in compressed_data: bits = bin(byte)[2:].rjust(8, '0') bit_string += bits encoded_text = self.remove_padding(bit_string) decompressed_text = self.decode_text(encoded_text) return decompressed_text # 示例 text = "this is an example for huffman encoding" h = HuffmanCoding(text) compressed_data = h.compress() decompressed_data = h.decompress(compressed_data) print("Compressed data:", compressed_data) print("Decompressed data:", decompressed_data) ```

相关推荐

最新推荐

recommend-type

数据结构课程设计哈夫曼树编译码器报告.doc

开发环境:VC++ 6.0 (1) I:初始化(Initialization)。 (2) E:编码(Encoding)。...(4) P:打印代码文件(Print)。 (5)T:打印哈夫曼树(HuffmanTreePrint)。 (6)Q:退出程序(Quit)。
recommend-type

数据结构课程设计_哈夫曼树

1、训练学生灵活应用所学数据结构知识,独立完成问题分析,结合数据结构理论知识,编写程序求解指定问题。 2.初步掌握软件开发过程的问题分析、系统设计、程序编码、测试等基本方法和技能; 3.提高综合运用所学的...
recommend-type

数据结构—赫夫曼二叉树的应用

文件来源于百度文库 我觉得很有用 因为我刚看完了数据结构的这一章 这个资源还是很不错的
recommend-type

java数据结构与算法.pdf

包含了各种数据结构和算法(java)的实现方式和详解(图解),包括单双链表、环形链表(约瑟夫问题)、栈、后缀表达式、中缀表达式转后缀表达式、迷宫问题、八大排序算法、多种查找算法、哈希表、二叉树实现以及操作...
recommend-type

数据结构实验报告哈夫曼编码译码

程序设计任务: 设计一个程序,实现哈夫曼编码和译码的生成算法。...构造哈夫曼树,产生每个字符的Huffman编码, 打印之;输入电文,将其翻译成比特流, 打印之;输入比特流,将其还原成电文, 打印之。
recommend-type

zigbee-cluster-library-specification

最新的zigbee-cluster-library-specification说明文档。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

实现实时数据湖架构:Kafka与Hive集成

![实现实时数据湖架构:Kafka与Hive集成](https://img-blog.csdnimg.cn/img_convert/10eb2e6972b3b6086286fc64c0b3ee41.jpeg) # 1. 实时数据湖架构概述** 实时数据湖是一种现代数据管理架构,它允许企业以低延迟的方式收集、存储和处理大量数据。与传统数据仓库不同,实时数据湖不依赖于预先定义的模式,而是采用灵活的架构,可以处理各种数据类型和格式。这种架构为企业提供了以下优势: - **实时洞察:**实时数据湖允许企业访问最新的数据,从而做出更明智的决策。 - **数据民主化:**实时数据湖使各种利益相关者都可
recommend-type

云原生架构与soa架构区别?

云原生架构和SOA架构是两种不同的架构模式,主要有以下区别: 1. 设计理念不同: 云原生架构的设计理念是“设计为云”,注重应用程序的可移植性、可伸缩性、弹性和高可用性等特点。而SOA架构的设计理念是“面向服务”,注重实现业务逻辑的解耦和复用,提高系统的灵活性和可维护性。 2. 技术实现不同: 云原生架构的实现技术包括Docker、Kubernetes、Service Mesh等,注重容器化、自动化、微服务等技术。而SOA架构的实现技术包括Web Services、消息队列等,注重服务化、异步通信等技术。 3. 应用场景不同: 云原生架构适用于云计算环境下的应用场景,如容器化部署、微服务
recommend-type

JSBSim Reference Manual

JSBSim参考手册,其中包含JSBSim简介,JSBSim配置文件xml的编写语法,编程手册以及一些应用实例等。其中有部分内容还没有写完,估计有生之年很难看到完整版了,但是内容还是很有参考价值的。