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

news2024/11/19 18:28:13

 介绍:

  哈夫曼树(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点中的父亲、左孩子、右孩子下标都初始为0
		ht[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、s2
		ht[s1].parent = i, ht[s2].parent = i;//s1、s2父亲改为i
		ht[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.coloradmin.cn/o/1099124.html

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

相关文章

C语言——编译全过程的那些事

C语言——编译全过程的那些事 一、C语言的编译过程二、编译的详细过程2.1预编译过程2.2编译过程2.3 汇编过程2.4链接过程 三、编译全过程 一、C语言的编译过程 1.C语言的编译过程通常可以分为两个大的部分&#xff0c;编译和链接。 2.在ANSI C的任何一种实现中&#xff0c;存…

Vue检测数据的原理

Vue能够对用户的数据进行响应式&#xff0c;也就是你在data中写了什么&#xff0c;你在模板中用到data的部分就会渲染成什么&#xff0c;那么Vue是怎么知道用户修改了data中的数据变化并对模板重新进行解析的呢&#xff1f; 在Vue将数据存储为自身的_data之前&#xff0c;Vue会…

《中国工业经济》企业数字化转型与供应链配置—集中化还是多元化

文章利用2010-2021年A股上市公司数据&#xff0c;从供应链治理角度系统验证了企业数字化转型对供应链配置的影响及其作用机制 研究发现&#xff0c;企业数字化转型显著降低了供应链上游供应商、下游客户以及供应链整体集中度&#xff0c;推动供应链配置多元化&#xff1b;该推…

python使用dataset快速使用SQLite

目录 一、官网地址 二、安装 三、 快速使用 一、官网地址 GitHub - pudo/dataset: Easy-to-use data handling for SQL data stores with support for implicit table creation, bulk loading, and transactions. 二、安装 pip install dataset 如果是mysql&#xff0c;则…

基于冠状病毒群体免疫优化的BP神经网络(分类应用) - 附代码

基于冠状病毒群体免疫优化的BP神经网络&#xff08;分类应用&#xff09; - 附代码 文章目录 基于冠状病毒群体免疫优化的BP神经网络&#xff08;分类应用&#xff09; - 附代码1.鸢尾花iris数据介绍2.数据集整理3.冠状病毒群体免疫优化BP神经网络3.1 BP神经网络参数设置3.2 冠…

7.memchr函数

#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<string.h>int main() {int* ans NULL;char arr[] "abcdef";int len 3;/*共查找len个字节*/char ch d;ans memchr(arr, ch, len);if (NULL ans){printf("前%d个字符中&#xff0c…

数据结构与算法课后题-第六章(图的基本概念)

文章目录 1 图的基本概念2 基本概念及术语1 有向图2 无向图3 简单图、多重图4 完全图5 子图6 连通 、连通图和连通分量7 强连通图、强连通分量8 生成树、生成森林 参考博客&#xff1a; 数据结构&#xff1a;图(Graph)【详解】 1 图的基本概念 2 基本概念及术语 1 有向图 2 无…

深度分析c+引用的本质以及引用与指针的区别

文章目录 引用的概念引用的定义引用的特性引用的权限问题引用的使用方式引用作参数引用作返回值指针的本质引用和指针的区别 引用的概念 引用不是新定义一个变量&#xff0c;而是给已存在变量取了一个别名&#xff0c;编译器不会为引用变量开辟内存空间&#xff0c;它和它引用…

Oracle数据库SQL*Plus命令行执行SQL语句时,中文乱码报错解决方法

文章目录 问题背景解决方案1. 设置NLS_LANG环境变量2. 修改SQL*Plus字符集设置3. 使用Unicode字符集 常见错误和解决方法结语 &#x1f389;欢迎来到Java学习路线专栏~Oracle数据库SQL*Plus命令行执行SQL语句时&#xff0c;中文乱码报错解决方法 ☆* o(≧▽≦)o *☆嗨~我是IT陈…

【jmeter】接口测试流程

1、Jmeter简介 Jmeter是由Apache公司开发的一个纯Java的开源项目&#xff0c;即可以用于做接口测试也可以用于做性能测试。 Jmeter具备高移植性&#xff0c;可以实现跨平台运行。 Jmeter可以实现分布式负载。 Jmeter采用多线程&#xff0c;允许通过多个线程并发取样或通过独…

NTFS磁盘格式读写工具Tuxera NTFS 2023 for Mac中文破解版v2023含最新激活序列号

Tuxera NTFS 2023 Mac 是一个NTFS文件系统驱动程序&#xff0c;为解决Mac上不能对NTFS格式硬盘进行访问和读写而生。实现苹果Mac OS X系统读写Microsoft Windows NTFS文件系统&#xff0c;在硬盘、U盘等外接设备中进行全面访问、删除、修改等相关操作。 tuxera ntfs 2023 破解…

计算机网络第2章-CDN(4)

视频流和内容分发网 HTTP流和DASH 在HTTP流中&#xff0c;视频只是存储在HTTP服务器中作为一个普通的文件&#xff0c;每个文件有有一个特定的URL。当用户要看视频时&#xff0c;客户与服务器之间创建一个TCP连接并发送HTTP GET请求。 HTTP流具有严重缺陷&#xff0c;即所有…

扩大减产,NAND Flash市场迎来涨价潮 | 百能云芯

根据TrendForce的最新研究&#xff0c;NAND Flash市场即将面临一轮全面涨价的浪潮。供应商们通过严格控制产出量&#xff0c;将在第四季实施合约价的涨幅&#xff0c;预计在8%到13%之间。明年除非原厂仍能维持减产策略&#xff0c;且需留意服务器领域对Enterprise SSD需求是否回…

【Qt高阶】linux下编译提示找不到依赖的库【2023.10.16】

现象 提示找不到一些库文件。 排查方法 查看qmake出来的 makefile文件&#xff0c;相对路径是按照makefile文件所在路径进行查找。 命令行编译正常&#xff0c;拿QtCreator编译不过 把下面的勾去掉&#xff0c;直接在当前目录构建。

4.Vue-Vue调用第三方接口

题记 用vue调用第三方接口&#xff0c;以下是全部代码和操作流程。 寻找第三方接口网站 推荐&#xff1a;免费API - 提供免费接口调用平台 (aa1.cn) 下面的代码以下图中的接口为例 调用第三方接口代码 TestView.vue文件如下&#xff1a; <template> <div > <…

[nlp] chathome—家居装修垂类大语言模型的开发和评估

ChatHome: Development and Evaluation of a Domain-Specific LanguageModel for Home Renovation ChatHome: 家居装修垂类大语言模型的开发和评估 1、摘要: 我们的方法包括两个步骤:首先,使用广泛的家庭装修数据集(包括专业文章、标准文档和网络内容)对通用模型进行后预训…

【Operating Systems:Three Easy Pieces 操作系统导论 】抽象:地址空间

【Operating Systems:Three Easy Pieces 操作系统导论 】 早期系统 操作系统曾经是一组函数&#xff08;实际上是一个库&#xff09;&#xff0c;在内存中&#xff08;在本例中&#xff0c;从物理地址0开始&#xff09;&#xff0c;然后有一个正在运行的程序&#xff08;进程&…

记一次关于应用程序无法连接postgresql数据的问题排查

1. 完整的错误信息 could not connect to server: No such file or directory is the server running locally and accepting connections on Unix domain socket "/var/run/postgresql/.s.PGSQL.5432"? 2.排查过程 2.1.首先&#xff0c;我们先确保postgresql在运…

OpenHarmony创新赛丨报名倒计时,超强秘籍带你直通大奖!

OpenHarmony创新赛报名倒计时开始啦&#xff01; 设于开放原子全球开源大赛下的OpenHarmony创新赛&#xff0c;目前正在如火如荼地进行赛事招募中&#xff01;这次大赛围绕创新应用、商显行业、金融行业三大赛题&#xff0c;邀请来自企业、个人、高校师生等各界群体的优秀开发者…

浅谈安科瑞无线测温设备在俄罗斯某项目的应用

摘要&#xff1a;安科瑞ATE系列和ARTM-Pn无线测温设备适用于高低压柜的梅花触头&#xff0c;线缆&#xff0c;母排等位置对温度的实时监测。 Abstract: ATE series and ARTM-Pn are suitable for monitoring the real-time temperature of circuit breaker contact,cable,busb…