哈夫曼树的建立(C++,最优树)

 介绍:

  哈夫曼树(Huffman Tree)是一种用于数据压缩的树形数据结构。它是由刚特·哈夫曼于1952年发明的。

  哈夫曼树的特点是:对于一个长度为n的字符集,它可以将每个字符在树上表示为一个唯一的二进制编码。在哈夫曼树中,每个叶节点都代表一个字符,并且每个叶节点的权值都等于该字符在原始字符集中的出现频率。哈夫曼树的构建算法保证了权值越高的节点越靠近根节点,使得出现频率高的字符拥有最短的编码,从而达到数据压缩的效果。

构建哈夫曼树的步骤:

1. 根据字符出现频率,将所有字符按权值从小到大排序。

2. 选出权值最小的两个字符作为左右子树,创建一个新的节点,将这两个节点作为新节点的子节点,并将新节点的权值设为这两个节点的权值之和。

3. 将新节点插入到原来的字符集中,并重新排序。

4. 重复步骤2和步骤3,直到只剩下一个节点,即为哈夫曼树的根节点。

从哈夫曼树的根节点开始到每个叶节点的路径就是该叶节点对应字符的哈夫曼编码。通过哈夫曼编码,可以将原始字符串中的字符转换为二进制编码,从而实现数据压缩。

简单哈夫曼树建立:

输入:节点个数,以及各点权值

思路:代码注释里

输出:各点的权值,双亲,左右孩子

代码:

#include<iostream>//建立哈夫曼树
using namespace std;
typedef struct node
{int weight;int parent, lchid, rchild;}HT,*Htree;
int flag[1000] = { 0 };
void Select(Htree& ht, int n, int& s1, int& s2)
{int min1=999, min2=999;for (int i = 1; i <= n; i++)//查找权值第一小的点{if (flag[i] == 0 && (ht[i].weight < min1)){min1 = ht[i].weight;s1 = i;}}flag[s1] = 1;//标记该点移出for (int i = 1; i <= n; i++)//查找权值第二小的点{if (flag[i] == 0 && (ht[i].weight < min2)){min2 = ht[i].weight;s2 = i;}}flag[s2] = 1;//标记该点移出
}
void Inithtree(Htree& ht, int n)//初始化
{if (n <= 1) return;int m = 2 * n - 1;ht = new HT[m+1];for (int i = 1; i <= m; i++)//将1到m点中的父亲、左孩子、右孩子下标都初始为0ht[i].parent = 0, ht[i].lchid = 0, ht[i].rchild = 0;cout << "输入各点权值:" << endl;for (int i = 1; i <= n; i++)cin >> ht[i].weight;
}
void Createhtree(Htree& ht, int n)//建树
{int s1, s2;for (int i = n + 1; i <= 2 * n - 1; i++)//循环n-1次,建树{Select(ht, i - 1, s1, s2);//查找两个父亲为0且权值最小的点,并返回序号s1、s2ht[s1].parent = i, ht[s2].parent = i;//s1、s2父亲改为iht[i].lchid = s1, ht[i].rchild = s2;//s1、s2分别作为i的左右孩子ht[i].weight = ht[s1].weight + ht[s2].weight;//i的权值为左右孩子权值之和}
}
void Printtree(Htree& ht, int n)
{for (int i = 1; i <= 2 * n - 1; i++)cout << i <<" "<< ht[i].weight << " " << ht[i].parent << " " << ht[i].lchid << " " << ht[i].rchild << endl;
}
int main()
{Htree h;int n;cin >> n;//输入节点个数Inithtree(h,n);Createhtree(h, n);cout << "HT的终态:" << endl;Printtree(h, n);
}

 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

NSSCTF做题(10)

叫10好听一点&#xff0c;就是补9的 第7页的内容 [SWPUCTF 2022 新生赛]ez_sql get传参说是不安全&#xff0c;那就只能用post了 有回显了&#xff0c;两个假的flag 发现万能密码 1 or 11#变成了 11# 11# 1 11#1# 11# 11# 发现or和空格都无了&#xff0c;union也过滤 …

golang的json转pb验证

基于这篇文章的最后一个代码进行验证。 https://blog.csdn.net/mijichui2153/article/details/133894403?csdn_share_tail%7B%22type%22%3A%22blog%22%2C%22rType%22%3A%22article%22%2C%22rId%22%3A%22133894403%22%2C%22source%22%3A%22mijichui2153%22%7D 1、准备 &…

Python新手常犯的8个错误,你中招了吗?

我们都知道Python是一门非常流行和强大的编程语言&#xff0c;而作为一个刚入门Python编程的新手&#xff0c;你可能会犯一些常见的错误&#xff0c;这些错误可能会阻碍你的学习和项目进展。 如何避免这些常见的错误呢&#xff1f;在本文中&#xff0c;小编将为你介绍8个新手P…

OJ第四篇

文章目录 链表分割环形链表有效的括号 链表分割 链接: 链表分割 虽然这个题牛客网中只有C,但是无所谓&#xff0c;我们只要知道C是兼容C的就可以了 至于说这个题的思路&#xff0c;我们就弄两个链表&#xff0c;把小于x的结点放到一个链表中&#xff0c;剩下的放到另一个链表…

【c#】Quartz开源任务调度框架学习及练习Demo

Quartz开源任务调度框架学习及练习Demo 1、定义、作用 2、原理 3、使用步骤 4、使用场景 5、Demo代码参考示例 6、注意事项 7、一些Trigger属性说明 1、定义、作用 Quartz是一个开源的任务调度框架&#xff0c;作用是支持开发人员可以定时处理业务&#xff0c;比如定时…

python实现TCPclient

python实现TCPclient是一件简单的事情&#xff0c;只要通过socket这个模块就可以实现。 一、实现步骤 1、导入模块&#xff1a; 首先&#xff0c;你需要导入Python的socket模块。 import socket2、创建Socket对象&#xff1a; 使用socket.socket()函数创建一个新的socket对…

Flink学习---15、FlinkCDC(CDC介绍、案例实操)

星光下的赶路人star的个人主页 未来总是藏在迷雾中让人胆怯&#xff0c;但当你踏入其中&#xff0c;便会云开雾散 文章目录 1、CDC简介1.1 什么是CDC1.2 CDC的种类1.3 Flink-CDC 2、FlinkCDC案例实操2.1 开启MySQL Binlog并重启MySQL2.2 FlinkSQL方式的应用2.2.1 导入依赖2.2.2…

【Java 进阶篇】HTML DOM 事件详解

当用户在网页上点击按钮、输入文本、鼠标移动到某个区域或执行其他互动操作时&#xff0c;这些动作都可以触发事件。HTML DOM&#xff08;文档对象模型&#xff09;允许我们使用JavaScript来捕获、处理和响应这些事件&#xff0c;以实现网页的交互和动态性。本篇博客将围绕HTML…

iOS原生、Android 原生, flutter 三种方式给照片流添加文字(水印)

效果图:三中代码实现的效果差不多 Swift:代码 import UIKitclass ImageWatermarking: NSObject {static func textToImage(drawText text: String, inImage initImage: UIImage, atPoint point: CGPoint) -> UIImage {let textColor = UIColor.whitelet textFont = UIFon…

DPDK收发包流程分析

一、 前言 DPDK是intel工程师开发的一款用来快速处理数据包的框架,最初的目的是为了证明传统网络数据包处理性能低不是intel处理器导致的,而是传统数据的处理流程导致,后来随着dpdk的开源及其生态的快速发展,dpdk成为了高性能网络数据处理的优秀框架。本篇文章主要介绍DPDK…

Django实现音乐网站 ⒇

使用Python Django框架做一个音乐网站&#xff0c; 本篇音乐播放器-添加播放音乐功能实现。 目录 创建播放器数据表 设置表结构 执行创建表 命令 执行 数据表结构 添加单个歌曲 创建路由 加入播放器视图 模板处理 基类方法 子页面调用 优化弹窗 加入layui文件 基…

在URP管线中添加ShaderMaterial自定义GUI的方法

编写GUI面板 1. 新建GUI子面板 using UnityEngine; using UnityEngine.Rendering;namespace UnityEditor.Rendering.Universal.ShaderGUI {internal class CP_XXXOutLineGUI{public static class Styles{}public struct LitProperties{public LitProperties(MaterialProperty…

vxe-table添加排序

在 <vxe-column> 中添加sortable属性 <vxe-columnfield"longitude"sortabletitle"经度"></vxe-column><vxe-columnfield"latitude"sortabletitle"纬度"></vxe-column><vxe-columnfield"dateEst…

Spring Boot如何优雅实现动态灵活可配置的高性能数据脱敏功能

1.背景 在当下互联网高速发展的时代下&#xff0c;涉及到用户的隐私数据安全越发重要&#xff0c;一旦泄露将造成不可估量的后果。所以现在的业务系统开发中都会对用户隐私数据加密之后存储落库&#xff0c;同时还要求后端返回数据给前台之前进行数据脱敏。所谓脱敏处理其实就…

TikTok Shop美国本土店VS跨境店,如何选择?有何区别?

TikTok不仅仅是一个用于分享有趣短视频的平台&#xff0c;它也逐渐成为了商家们极力推广自己品牌和产品的场所。 在TikTok的商业生态系统中&#xff0c;存在几种不同的商店类型&#xff0c;各有其独特性和适用场景。今天&#xff0c;我们就来深入探讨这些店的差异与特点。 一、…

Si24R2|2.4G单发射芯片 +7dBm可调功率 校讯通

Si24R2是一种通用、低功耗、高性能的2.4GHz无线射频发射芯片&#xff0c;主要用于单向通信系统&#xff0c;以降低系统成B&#xff0c;在运行中与si24r1兼容。 Si24r2具有低功耗和低成B。 它主要用于单向低功率传输系统&#xff0c;如无线控制系统、无线数据采集系统等。 Si2…

在mysql8查询中使用ORDER BY结合LIMIT时,分页查询时出现后一页的数据重复前一页的部分数据。

这里写目录标题 问题描述&#xff1a;问题模拟&#xff1a;原因分析问题解释问题解决验证官方文档支持 问题描述&#xff1a; 在mysql8查询中使用ORDER BY结合LIMIT时&#xff0c;分页查询时出现后一页的数据重复前一页的部分数据。 问题模拟&#xff1a; 表table_lock_test&…

Milvus 介绍

Milvus 介绍 Milvus 矢量数据库是什么&#xff1f;关键概念非结构化数据嵌入向量向量相似度搜索 为什么是 Milvus?支持哪些索引和指标&#xff1f;索引类型相似度指标(Similarity metrics) 应用示例Milvus 是如何设计的&#xff1f;开发者工具API访问Milvus 生态系统工具 本页…

《数据结构、算法与应用C++语言描述》使用C++语言实现数组双端队列

《数据结构、算法与应用C语言描述》使用C语言实现数组双端队列 定义 队列的定义 队列&#xff08;queue&#xff09;是一个线性表&#xff0c;其插入和删除操作分别在表的不同端进行。插入元素的那一端称为队尾&#xff08;back或rear&#xff09;&#xff0c;删除元素的那一…

【vue】el-carousel实现视频自动播放与自动切换到下一个视频功能:

文章目录 一、原因:二、实现代码:三、遇到的问题&#xff1a;【1】问题&#xff1a;el-carousel页面的视频不更新【2】问题&#xff1a;多按几次左按钮&#xff0c;其中跳过没有播放的视频没有销毁&#xff0c;造成再次自动播放时会跳页 一、原因: 由于后端无法实现将多条视频拼…