哈夫曼树的建立(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;剩下的放到另一个链表…

群狼调研(长沙社情民意调查) | 残疾人服务满意度调查流程

以下是一个基本的残疾人服务满意度调查流程&#xff0c;可以根据实际情况进行调整和修改&#xff1a; 1. 制定调查目标和范围&#xff1a;明确调查的目标、范围和重点&#xff0c;确定需要评估的服务类型和方面。 2. 制定调查计划&#xff1a;确定调查的时间表、预算、人员分…

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

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

Python常用视频编辑操作——读取与保存视频、更改帧数、拼接视频、视频语音合并、视频与图像互转等

1.更改视频帧数 降低视频帧数&#xff0c;简单的操作只能降低视频帧数&#xff0c;如果要增加视频帧数&#xff0c;那就要使用深度学习进行插帧处理&#xff1a; import cv2 from moviepy.editor import * def change_fps(inpt_path,output_path,fps):# 加载视频video Video…

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…

Elasticsearch2.x Doc values

文档地址&#xff1a; https://www.elastic.co/guide/en/elasticsearch/reference/2.4/doc-values.html https://www.elastic.co/guide/en/elasticsearch/guide/2.x/docvalues-intro.html https://www.elastic.co/guide/en/elasticsearch/guide/2.x/docvalues.html https://ww…

【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…

ccpc2023秦皇岛F. Mystery of Prime(dp)

题目要求改变数组中的数字使相邻数字之和是质数&#xff0c;同时改变数字的次数最少 因为改变的数字可以无穷大 我假设当一个数改变为一个某一个偶数时&#xff0c;他周围的任意的奇数肯定能和他相加变成质数 当一个数变为某一个大于1的奇数时&#xff0c;他周围任意偶数肯定…

港联证券:资金融通构成强支撑 “一带一路”金融合作开新局

本年是共建“一带一路”主张提出十周年。经过十年打开&#xff0c;共建“一带一路”从夯基垒台、立柱架梁到落地生根、持久打开&#xff0c;已成为打开包容、互利互惠、协作共赢的国际协作途径。“资金融通”作为首份“一带一路”白皮书提出的“五通”之一&#xff0c;定位为“…

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…

Cross decomposition交叉分解大比拼:性能、应用场景和可视化对比总结

交叉分解(Cross Decomposition)在机器学习中是一种用于分析两组变量之间关系的技术。它能够找出两组数据之间的线性关系,并将这些关系用于预测或分类。在本文中将探讨四种不同的交叉分解方法:CCA(典型相关分析)、PLSCanonical、PLSRegression和PLSSVD,并从五个方面进行详…

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

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