哈夫曼编码

2023-10-26

哈夫曼编码(Huffman Coding),又称霍夫曼编码,是一种编码方式,哈夫曼编码是可变字长编码(VLC)的一种。Huffman于1952年提出一种编码方法,该方法完全依据字符出现概率来构造异字头的平均长度最短的码字,有时称之为最佳编码,一般就叫Huffman编码(有时也称为霍夫曼编码)。

下面是用C语言实现的简单的哈夫曼编码实现,要实现编码,首先得创建哈夫曼树(也叫最优二叉树)。

哈夫曼树就是带权路径长度(WPL)最小的二叉树,而权路径长度(WPL)指的是出现频率*其到根节点的长度。最后使出现平率高的越靠近根节点。

哈夫曼编码的优点便是降低重复的码值,实现无损压缩。

#include <stdio.h>
#include <stdlib.h>
//结构体创建节点 
typedef struct{
char word;
int weight,left,right,parent;
int *code;
}HuffNode;
//初始化森林(对节点与权值进行初始化)
int n;
void StartHuffTree(HuffNode * F){
	int i,w;
	char ch;
	printf("请输入字符与权重(空格间隔,回车结束):\n");
	for(i=0;i<n;i++){
		printf("第%d个节点:",i+1); 
		scanf("%s",&ch);
		scanf("%d",&w);
		F[i].word=ch;
		F[i].weight=w;
		F[i].left=F[i].right=F[i].parent=-1;
		F[i].code=NULL;
	}
	printf("----------------------------------------------------\n");
}


//创建哈夫曼树  (创建哈夫曼树,最优二叉树)
void CreatHuffTree(HuffNode * F){ 
	printf("创建哈弗曼树:\n");
	int i,j,k1,k2; 
	//循环n-1次创建树的双亲 
	for(i=0;i<n-1;i++){
	//k1,k2找到可以作为子树的树 
		for(k1=0;k1<n+i&&F[k1].parent!=-1;k1++);
		for(k2=k1+1;k2<n+i&&F[k2].parent!=-1;k2++);
		//循环 整个森林,使得k1,k2为最小的次小的2颗树 
		for(j=k2;j<n+i;j++){
			if(F[j].parent==-1){
			if(F[j].weight<F[k1].weight){
				k2=k1;
				k1=j;
			}
			else if(F[j].weight<F[k2].weight){
				k2=j;
			}
		}
	} 
	//在第n+i节点 上创建k1,k2的双亲 
	F[n+i].word='x';
	F[n+i].weight=(F[k1]).weight+(F[k2]).weight;
	F[n+i].left=k1;
	F[n+i].right=k2;
	F[n+i].parent=-1;
	F[n+i].code=NULL;
	F[k1].parent=n+i;
	F[k2].parent=n+i;
	// printf("%d",F[n+i].parent); 
	// getchar();
	// 
}
//判断创建的树是否正确 
for(j=0;j<7;j++){
	printf("%4c",F[j].word);
	printf("%4d",F[j].weight);
	printf("%4d",F[j].left);
	printf("%4d",F[j].right);
	printf("%4d\n",F[j].parent);
}
	printf("-----------------------------------------------------\n");
}

//对哈弗曼树进行编码 
void CreatCode(HuffNode * F){
	printf("哈弗曼树编码:............\n");
	int i,pa,c;
	int *p;
for(i=0;i<n;i++){
	F[i].code=p=(int *)malloc(n*sizeof(int));
	p[0]=0;
	c=i;
	while(F[c].parent!=-1){
		pa=F[c].parent;
		if(F[pa].left==c){
			p[++p[0]]=0;
		}else{
			p[++p[0]]=1;
		}
		c=pa;
	
	}
}
}


void PrintHuffTree(HuffNode * F){
	printf("输出哈夫曼编码:\n");
	for(int i=0;i<n;i++){
		printf("%4c",F[i].word);
		printf("   ");
	for(int j=F[i].code[0];j>0;j--){

		printf("%d",F[i].code[j]);
	}
		printf("\n");
	}
}
int main(void)
{
	printf("输入叶子节点个数:");
	scanf("%d",&n);
	//初始化 
	HuffNode * F=(HuffNode *)malloc((2*n-1)*sizeof(HuffNode));
	StartHuffTree(F); 
	//创建哈夫曼树
	CreatHuffTree(F); 
	//编码
	CreatCode(F);
	//输出
	PrintHuffTree(F); 
	return 0;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

哈夫曼编码 的相关文章

  • 递增二叉树-网易游戏

    递增二叉树 网易游戏 题目描述 给定一个二叉树 每个节点有一个正整数权值 若一棵二叉树 每一层的节点权值和都严格小于下一层的结点权值和 责成这棵二叉树为递增二叉树 现在给你一棵二叉树 你需要判断其是不是一棵递增二叉树 输入描述 输入的第一行
  • python 2、python读取.htm文件报错:UnicodeDecodeError: 'utf8' codec can't decode byte 0xb3 in position 0的解决方法

    问题是这样的 我用python写的程序去读取 htm文件中的数据 刚开始我用 fr open 0 htm r 时 程序运行后直接崩溃 后来根据提示的错误信息 ValueError encoding must be one of utf 8
  • 算法——因子和阶乘

    题目描述 输入正整数n 2 lt n lt 100 把阶乘n 1x2x3x xn分解成素因子相乘的形式 从小到大输出各个素数 2 3 5 的指数 你的程序应忽略比最大素因子更大的素数 否则末尾会有无穷对个0 样例输入 5 53 样例输出 5
  • 有趣的数据结构算法16——线索二叉树的构建

    有趣的数据结构算法16 线索二叉树的构建 什么是线索二叉树 线索二叉树的实现形式 线索二叉树的代码实现 线索二叉树的初始化 线索的串联 全部实现代码 GITHUB下载连接 深度遍历不仅仅有递归的方法噢 还有通过建立线索二叉树进行遍历的方法
  • 二叉排序树的基本操作

    二叉排序树的应用 利用二叉链表存储二叉排序树 输入一组任意序列 实现二叉排序树的创建 插入 删除 中序遍历 要求 有菜单进行选择 安排 2020 6 4 晴朗 二叉排序树的基本定义 1 左子树的所有节点小于根节点 2 若右子树非空 则右子树
  • 【java实现二叉树的各种遍历方式】

    二叉树的各种遍历方式 通过递归方式 可实现二叉树的层级遍历 先序 中序 后序等遍历方式 package com ykq import java util ArrayList import java util List author ykq
  • cookie中文乱码问题

    下面是写入cookie的代码 csharp view plain copy Cookie nameCookie new Cookie name 张三 nameCookie setMaxAge 60 60 24 30 response add
  • java判断是否为序列二叉树 - Kaiqisan

    大家好 都吃晚饭了吗 我是Kaiqisan 是一个已经走出社恐的一般生徒 今天还是二叉树诶嘿嘿 首先还是明确一个概念 何为序列二叉树 答 中序遍历之后序列递增的二叉树为序列二叉树 比如这棵树 4 2 7 1 3 5 8 6 它的中序遍历结果
  • 【数据结构】树与二叉树总结(一)

    数据结构 树与二叉树的总结 一 1 AVL树 动态平衡二叉树 树表的查找 2 哈夫曼树 二叉树的应用 3 树 树与二叉树的转换 4 分裂树 5 S K R 注 K为结点 R为关系 一 树 定义 n n gt 0 个结点构成的有限集合 当n
  • 力扣 - 102、二叉树的层序遍历(剑指Offer - 面试题32:从上到下打印二叉树)

    题目 给你一个二叉树 请你返回其按 层序遍历 得到的节点值 即逐层地 从左到右访问所有节点 示例 二叉树 3 9 20 null null 15 7 3 9 20 15 7 输出层序遍历的结果 3 9 20 15 7 分析 迭代法 用一个队
  • 【数据结构】&&【C++】平衡搜索二叉树的模拟实现(AVL树)

    数据结构 C 平衡搜索二叉树的模拟实现 AVL树 一 AVL树的性质 二 AVL树的模拟实现 AVL树结点的定义 AVL树的插入 平衡因子的更新 左单旋 右单旋 双旋 左右旋 右左旋 AVL树的删除 检查是否是AVL树 三 完整代码 一 A
  • 剑指 Offer 27. 二叉树的镜像 -- 递归

    0 题目描述 leetcode原题链接 剑指 Offer 27 二叉树的镜像 1 递归算法 根据二叉树镜像的定义 考虑递归遍历 d f s mathrm dfs dfs 二叉树 交换每个节点的左 右子节点 即可生成 二叉树的镜像 递归解析
  • 二叉树层次遍历的相关应用(伪代码)

    1 层次遍历 void LevelOrder BTree t Queue Q initQueue Q EnQueue Q t while Empty Q TNode p DeQueue Q if p gt lchird EnQueue Q
  • 字符集、编码、Oracle

    目录 一 字符集与编码常识 字符集 编码 ASCII GB2312 GBK GB18030 第二部分 Oracle中的编码与字符集 1 为什么需要两个字符集 2 字符集名称的玄机 3 例子很重要 3 1 准备两个数据库 3 2 工具很重要
  • 【数据结构】树与二叉树

    文章目录 树型结构 什么是树型结构 树型结构的概念 树的表示形式 树的应用 二叉树 二叉树的概念 两种特殊的二叉树 二叉树的性质 二叉树性质练习 练习一 解析 练习二 解析 练习三 解析 练习四 解析 总结 树型结构 什么是树型结构 树是一
  • 用 Java 实现的八种常用排序算法

    八种排序算法可以按照如图分类 前置知识 1 算法稳定性 在一个序列中 能保证两个相等的数 经过排序之后 其在序列的前后位置顺序不变 A1 A2 排序前 A1 在 A2 前面 排序后 A1 还在 A2 前面 2 时间复杂度 时间复杂度是用于衡
  • 【数据结构初阶】第七节.树和二叉树的基本操作

    作者简介 大家好 我是未央 博客首页 未央 303 系列专栏 Java初阶数据结构 每日一句 人的一生 可以有所作为的时机只有一次 那就是现在 文章目录 前言 一 二叉树的快速构建 二 二叉树的遍历 2 1 前序遍历 2 2 中序遍历 2
  • 编码 & 8421BCD 码的故事

    计算机编码中 我们都是先了解了二进制 其中分有符号数 无符号数 然后会接触到BCD码 那么BCD码是怎么产生的 为什么又要用四位二进制来表示呢 8421BCD 码的故事 一 BCD码 1 由来 2 8421BCD码 3 修正 二 底层验证修
  • Java基础之随机生成数字和字母

    原文地址 http blog csdn net yaodong y article details 8115250 字母与数字的ASCII码 目 前计算机中用得最广泛的 字符集及其编码 是由美国国家标准局 ANSI 制定的ASCII码 Am
  • 多媒体开发计算机颜色相关知识

    颜色模式 颜色模式 颜色模型和颜色空间 计算机中的颜色格式 常用的颜色模型分类 RGB颜色模型 介绍 RGB模型的颜色空间 RGB555 RGB565 RGB24 RGB32 FFMPEG中定义的RGB色彩空间 显示器的颜色空间

随机推荐

  • 认识BLE 5协议栈 —— 逻辑链路控制与适配协议层(L2CAP,Logical Link Control and Adaptation Protocol)

    转自 http www sunyouqun com 2017 04 understand ble 5 stack l2cap layer 逻辑链路控制与适配协议通常简称为L2CAP Logical Link Control and Adap
  • 第十届蓝桥杯(明码+迷宫)

    第十届蓝桥杯省赛C B组 明码 汉字的字形存在于字库中 即便在今天 16点阵的字库也仍然使用广泛 16点阵的字库把每个汉字看成是16x16个像素信息 并把这些信息记录在字节中 一个字节可以存储8位信息 用32个字节就可以存一个汉字的字形了
  • mybatis-plus动态表名实现

    mybatis plus动态表名实现 1 使用场景 一个mybatis entity 对应多张表 表明不同的表 gt 多张表结构一致只有表名称不同 在使用时 可以动态映射表名称 比如 按照时间分表 某些业务冷热数据分离后数据存在不同的表中等
  • 服务器与云服务器传输文件,服务器与云服务器传输文件

    服务器与云服务器传输文件 内容精选 换一换 安装传输工具在本地主机和Windows云服务器上分别安装数据传输工具 将文件上传到云服务器 例如QQ exe 在本地主机和Windows云服务器上分别安装数据传输工具 将文件上传到云服务器 例如Q
  • 阿里云OSS进行文件下载时,报NOSuchKeys: com.aliyun.oss.OSSException: The specified key does not exist.

    OSS文件下载 bucketName bucket的名称 objectName 保存文件时 OSS服务器返回给我们的url path 下载到本地的路径 OSSClient client new OSSClient endpoint acce
  • 钟汉良日记:啥都不会做什么副业好?

    2022年9月14日 周三 天气阴 服务的老板 昨天把搜狐号和网易号给我搞定后 我就把之前写的文章都同步更新到这两个自媒体平台上 今天再查看 网易号上发布的文章 排名也上了百度首页 你看 自媒体平台发布文章效果就是这么好 现在已经不是过去那
  • 用nginx Rtmp Module自建直播服务器

    下载源码 首先准备好源码和常用编译工具 gcc之类的 mkdir opt git 这里我偷懒直接把源码下载到这了 大家自行找地方 cd opt git git clone https github com arut nginx rtmp m
  • Java_经典算法之桶排序

    一 桶排序介绍 桶排序是计数排序的升级版 它利用了函数的映射关系 高效与否的关键就在于这个映射函数的确定 为了使桶排序更加高效 我们需要做到这两点 在额外空间充足的情况下 尽量增大桶的数量 使用的映射函数能够将输入的 N 个数据均匀的分配到
  • matlab在循环时如何跳过几个数,matlab如何得到一个数组的行数和列数, matlab判断数组的长度

    1 matlab在循环时如何跳过几个数 eg 循环输出1到10 但需要跳过5 for i 1 4 6 10 fprintf d n i end 2 matlab中如何得到数组的行数和列数 eg 创建一个2 3的0向量 并判断行数和列数 m
  • C++ const

    class A private const int a 常对象成员 可以使用初始化列表或者类内初始化 public 构造函数 A a 0 A int x a x 初始化列表 const可用于对重载函数的区分 int getValue 普通成
  • ubuntu编译caffe

    https blog csdn net weixin 42068754 article details 103386379 spm 1001 2101 3001 6661 1 utm medium distribute pc relevan
  • conda创建的虚拟环境和Pycharm创建的虚拟环境有什么区别。

    问题描述 刚开始学习深度学习时 不同项目都需要安装不同的库 有时为了方便 不同的项目就使用了独立的虚拟环境 这样在加载库时比较快一些 如果所有项目的库都安装在base下 可能会出现版本不匹配之类的问题 所以 一开始使用的conda创建的虚拟
  • 内网穿透两种方式

    一 内网穿透引入 你是否被以下问题所困扰 我想装个B让其他同学在外网访问我的程序 应该怎么办 接了个小外包 给客户演示Demo没有站点怎么办 做微信 支付宝支付等其他第三方平台的功能 没有外网回调地址 应该怎么办 内网穿透 又叫NAT穿透
  • ODOO 安装

    ODOO 安装 对初学者而言 ODOO 的安装是横在面前的第一道坎 必须过的 和几年前情况不同 最近几年 ODOO在安装方面已经大幅改进 不需要太专业的技能也能完成安装过程 下面先说说大致的安装过程 有空再补上详细的图片和步骤 准备工作 1
  • [2017年第八届真题] 分巧克力

    题目 传送门 思路 二分答案 写个check函数 对每个mid进行检查可行性 结果再检查能不能切割出k块或以上的 l l 的巧克力 不能的话 要 1 Code include
  • 七、Hadoop系统应用之搭建Hadoop高可用集群(超详细步骤指导操作,WIN10,VMware Workstation 15.5 PRO,CentOS-6.7)

    Hadoop集群搭建前安装准备参考 一 Hadoop系统应用之安装准备 一 超详细步骤指导操作 WIN10 VMware Workstation 15 5 PRO CentOS 6 7 一 Hadoop系统应用之安装准备 二 超详细步骤指导
  • 大话赛宁云

    如今 随着数字时代的飞速发展 安全漏洞存在于网络空间中 对系统造成极大的安全隐患 为网络攻击者的恶意入侵提供了捷径 对此 解决这一困境 要秉承 快速 自动 安全 的解决标准 首先需要高技术手段的支持 实施常态化演练 及时发现安全漏洞 测评危
  • 暑期必须要学习的52个Python+OpenCV实战项目

    点击上方 小白学视觉 选择加 星标 或 置顶 重磅干货 第一时间送达 有个粉丝前几天问我 本人小白一枚 看了很多深度学习 机器学习以及图像处理等视频和书之后 理论有一些长进 但是实际运用能力不足 从反面也是由于理论认识不足所致 所以想问问有
  • 完整的vuejs + django 前后端分离项目实践(登录,注册,权限控制,可视化)

    完整的vuejs django 前后端分离项目实践 登录 注册 权限控制 可视化 vuejs是一个流行的前端框架 django是一个python非常流行的web框架 在某期的作业中 需要基于它两实现一个前端后分离 并且拥有权限管理的系统 声
  • 哈夫曼编码

    哈夫曼编码 Huffman Coding 又称霍夫曼编码 是一种编码方式 哈夫曼编码是可变字长编码 VLC 的一种 Huffman于1952年提出一种编码方法 该方法完全依据字符出现概率来构造异字头的平均长度最短的码字 有时称之为最佳编码