有关哈夫曼树的实现

1 问题

给定n个权值作为n个叶子结点,构造一棵二叉树。若该树的带权路径长度达到最少,称这样的二叉树为最优二叉树,也称为哈夫曼树。哈夫曼树是带权路径长度最短的树,权值较大的结点离根较近。而根据哈夫曼树的定义,可以思考有关哈夫曼树的实现该如何进行,本次周博客将围绕哈夫曼树的实现展开讨论。

2 方法

  1. 创建一个结点
  2. 创建哈夫曼树
  3. 编码哈夫曼编码
  4. 调用

通过实验、实践等证明提出的方法是有效的,是能够解决开头提出的问题。

代码清单 1

# 节点类
class Node(object):
   def __init__(self, name=None, value=None):
       self._name = name
       self._value = value
       self._left = None
       self._right = None
# 哈夫曼树类
class HuffmanTree(object):
   # 根据Huffman树的思想:以叶子节点为基础,反向建立Huffman树
   def __init__(self, char_weights):
       self.a = [Node(part[0], part[1]) for part in char_weights]  # 根据输入的字符及其频数生成叶子节点
       while len(self.a) != 1:
           self.a.sort(key=lambda node: node._value, reverse=True)
           c = Node(value=(self.a[-1]._value + self.a[-2]._value))
           c._left = self.a.pop(-1)
           c._right = self.a.pop(-1)
           self.a.append(c)
       self.root = self.a[0]
       self.b = list(range(10))  # self.b用于保存每个叶子节点的Haffuman编码,range的值只需要不小于树的深度就行
   # 用递归的思想生成编码
   def pre(self, tree, length):
       node = tree
       if not node:
           return
       elif node._name:
           print(node._name + '的编码为:',end=" ")
           for i in range(length):
               print(self.b[i],end="")
           print()
           return
       self.b[length] = 0
       self.pre(node._left, length + 1)
       self.b[length] = 1
       self.pre(node._right, length + 1)
   # 生成哈夫曼编码
   def get_code(self):
       self.pre(self.root, 0)
if __name__ == '__main__':
   # 输入的是字符及其频数
   char_weights = [('A', 27), ('B', 8), ('C', 15), ('D', 6), ('E', 30), ('F', 5)]
   tree = HuffmanTree(char_weights)
   tree.get_code()

3 结语

针对有关哈夫曼树的实现的问题,提出本次博客所涉及的方法,通过本次Python实验,证明该方法是有效的,本此的方法还存在许多不足或考虑不周的地方,希望在接下来的学习过程中可以更好的掌握哈夫曼树。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/776218.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Windows系统下载安装ngnix

一 nginx下载安装 nginx是HTTP服务器和反向代理服务器,功能非常丰富,在nginx官网首页,点击download 在download页面下,可以选择Stable version稳定版本,点击下载 将下载完成的zip解压即可,然乎在nginx所在…

Spring Boot 中的监视器是什么?有什么作用?

前言: 监听器相信熟悉 Spring、Spring Boot 的都知道,但是监视器又是什么?估计很多人一脸懵的状态,本篇分享一下 Spring Boot 的监视器。 Spring Boot 系列文章传送门 Spring Boot 启动流程源码分析(2) …

《数字图像处理-OpenCV/Python》第17章:图像的特征描述

《数字图像处理-OpenCV/Python》第17章:图像的特征描述 本书京东 优惠购书链接 https://item.jd.com/14098452.html 本书CSDN 独家连载专栏 https://blog.csdn.net/youcans/category_12418787.html 第17章:图像的特征描述 特征检测与匹配是计算机视觉的…

opencv概念以及安装方法

#opencv相关概念介绍 Open Source Computer Vision Library 缩写 opencv 翻译:开源的计算机视觉库 ,英特尔公司发起并开发,支持多种编程语言(如C、Python、Java等),支持计算机视觉和机器学习等众多算法&a…

【C++】开源:nlohmann/json数据解析库配置使用

😏★,:.☆( ̄▽ ̄)/$:.★ 😏 这篇文章主要介绍nlohmann/json数据解析库配置使用。 无专精则不能成,无涉猎则不能通。——梁启超 欢迎来到我的博客,一起学习,共同进步。 喜欢的朋友可以关注一下&am…

conda环境变量+常用操作+配置镜像源

、1、conda环境变量配置 根据我的上篇文章,应该都已经安装了conda和pycharm,然后可能会出现conda的没有配置到系统的环境变量上,这里首先教大家如何配置系统的环境变量,在进行后续操作,如果环境变量已经配置完毕可以自…

【C语言】指针(1)--入门理解

目录 一、内存和地址 二、指针变量和地址 三、指针变量类型的意义 一、内存和地址 只要讲指针就离不开内存 因为指针就是访问内存的 计算上CPU(中央处理器)在处理数据的时候,需要的数据是在内存中读取的,处理后的数 据也会放…

一款强大且免费开源的多连接数据库管理工具

大家好,今天给大家分享一款免费开源的跨平台数据库管理工具DbGate。 DbGate是一款免费开源的跨平台数据库管理工具,支持多种数据库,包括MySQL、PostgreSQL、SQL Server、MongoDB、SQLite等。它可以在Windows、Linux、Mac操作系统上运行&#…

亚信安全:《2024云安全技术发展白皮书》

标签 云计算 安全威胁 云安全技术 网络攻击 数据保护 一句话总结 《云安全技术发展白皮书》全面分析了云计算安全威胁的演进,探讨了云安全技术的发展历程、当前应用和未来趋势,强调了构建全面云安全防护体系的重要性。 摘要 云安全威胁演进&#xff…

刷题之合并两个有序数组(leetcode)

因为换了手机号码,之前leetcode的账号登不上去了,正好太久不刷题,很多思路都没了,所以重新开始刷leetcode! 这道题很简单,指针模拟一下,从后往前考虑,先看最大值。 class Solution…

昇思25天学习打卡营第13天|linchenfengxue

Diffusion扩散模型 关于扩散模型(Diffusion Models)有很多种理解,本文的介绍是基于denoising diffusion probabilistic model (DDPM),DDPM已经在(无)条件图像/音频/视频生成领域取得…

Qt json和xml操作

学习目标: 认识json和xml读写操作 前置环境 运行环境:qt creator 4.12 学习内容 XML XML(Extensible Markup Language)是一种标记语言,是一种用于描述数据结构的语言。它非常适合用于存储和传输数据。 XML 的主要特点如下: 可扩展性:XM…

【MySQL系列】VARCHAR 类型详解及其使用策略

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

中英双语介绍伦敦大学学院(University College London,UCL)

中文版 伦敦大学学院(UCL)简介 位置和周边环境 伦敦大学学院(University College London,简称UCL)位于英国伦敦市中心的布卢姆斯伯里(Bloomsbury)区。具体地址为: Gower Street, …

Python 游戏服务器架构优化

优化 Python 游戏服务器的架构涉及多个方面,包括性能、可伸缩性、并发处理和网络通信。下面是一些优化建议: 1、问题背景 在设计 Python 游戏服务器时,如何实现服务器的横向扩展,以利用多核处理器的资源,并确保服务器…

更新GCC版本问题处理(Could not resolve host: mirrorlist.centos.org;)更换SCL配置源/SCL后yum使用不了

SCL: 在 Linux 系统中,更新 GCC(GNU Compiler Collection)编译器需要使用 Software Collections (SCL) 库的原因主要有以下几点: https://wiki.centos.org/AdditionalResources/Repositories/SCLhttps://wiki.centos…

【算法】(C语言):快速排序(递归)、归并排序(递归)、希尔排序

快速排序(递归) 左指针指向第一个数据,右指针指向最后一个数据。取第一个数据作为中间值。右指针指向的数据 循环与中间值比对,若大于中间值,右指针往左移动一位,若小于中间值,右指针停住。右…

SpringSecurity 三更草堂学习笔记

0.简介 Spring Security是Spring家族中的一个安全管理框架。相比与另外一个安全框架Shiro,它提供了更丰富的功能,社区资源也比Shiro丰富。 一般来说中大型的项目都是使用SpringSecurity来做安全框架。小项目有Shiro的比较多,因为相比与Spring…

聚焦云技术,探讨 AGI 时代的云原生数据计算系统

6月22日,开源中国社区在上海举办了 OSC 源创会活动,本期活动以「云技术」为主题,邀请了来自华为 openEuler、字节跳动、AutoMQ 等厂商的技术大咖进行分享,拓数派作为云原生数据计算领域的引领者,受邀参与了本次活动&am…

Linux shell编程学习笔记62: top命令 linux下的任务管理器

0 前言 top命令是Unix 和 Linux下常用的性能分析工具,提供了一个动态的、交互式的实时视图,显示系统的整体性能信息,以及正在运行的进程的相关信息,包括各个进程的资源占用状况,类似于Windows的任务管理器。 1 top命令…