二进制哈夫曼编码c语言实现,二进制霍夫曼编码

通过查看其他博客的内容,整理一篇关于二进制霍夫曼编码的笔记供大家参考和讨论,如果有错误,欢迎大家联系我批评指正。

一、二进制霍夫曼的原理

我们可以将二进制霍夫曼编码拆分理解:

二进制即 0、1;

二进制编码就是用0和1的组合来表示其他字符;

霍夫曼编码(Huffman Coding)是一种编码方式,是一种用于无损数据压缩的熵编码(权编码)算法,通常用于无损数据压缩。(详见维基百科:https://en.wikipedia.org/wiki/Huffman_coding#n-ary_Huffman_coding)

二、编码方法:

1.将信源中n个符号按概率分布的大小,以递减次序排列(降序排列);

2.用0和1分别分配给概率最小的两个信源符号,并将这两个概率最小的信源符号合并为一个新符号,并用这两个概率最小的信源符号合并成一个新符号,从而得到只包含n-1个符号的新信源,称其为缩减信源;

3.把缩减信源的符号仍按概率大小降序排列,再将最后两个概率最小的符号合并为一个新符号,并分别用0、1表示,这样又形成一个新的缩减信源;

4.按2、3步骤继续进行直到缩减信源最后只剩下两个符号位置。再将最后两个新符号分别用0和1表示。最后这两个符号的概率之和为1,然后从最后一级缩减信源开始,依编码路径右后向前返回,就可以得到各信源符号所对应的码符号序列,即对应的码字。

通过典型的两个例题来介绍。

例题一:字符串“alibaba”的二进制霍夫曼编码有多少位?

1.1计算符号的概率并进行降序排序。

符号

概率

a

3/7

b

2/7

i

1/7

l

1/7

1.2构建二叉树

1.3从根节点数,得到a、b、i、l 对应的码字。

符号

概率

编码

a

3/7

0

b

2/7

11

i

1/7

100

l

1/7

101

例题二:现有一段文言文,要通过二进制哈夫曼编码进行压缩。假设这段文言文只由4个汉字“之”“乎”“者”“也”组成,它们出现的次数分别为700、600、300、200。那么,“也”字的编码长度是?

同理,按照例题一的三个步骤进行就可以得到:

符号

概率

编码

700

0

600

11

300

101

200

100

答:3位。

这道“之乎者也”没有像例题一一样出现相同的概率,但是其实保证字符的码字具有唯一性就行了。

例题三:字符串“ABCDADA”的二进制哈夫曼编码有多少位?

符号

概率

编码

A

3/7

0

D

2/7

10

C

1/7

111

B

1/7

110

所以字符串“ABCDADA”的二进制哈夫曼编码为(0110111100100),共13位。

出现次数越多的字符,编码越短;出现次数越少的字符,编码越长。这样就能让编码后的文件大小能够最短。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
哈夫曼编码是一种常用的数据压缩算法,可以通过将频率较高的字符用较短的编码表示来减小文件的大小。在C语言实现哈夫曼编码的压缩和解压缩过程,可以参考以下步骤: 1. 统计字符频率:通过读取待压缩的文件,统计各个字符的出现频率,可使用一个结构体数组来存储字符和对应的频率。 2. 构建哈夫曼树:根据字符的频率构建哈夫曼树,可以使用最小堆来实现。每个节点包含字符和频率,构建过程中,选取频率最小的两个节点合并为一个新节点,直到只剩下一个根节点。 3. 构建哈夫曼编码:从根节点开始,遍历哈夫曼树,给左子树编码添加'0',给右子树编码添加'1',将编码存储在字符对应的结构体中。 4. 创建压缩文件:再次读取待压缩的文件,将每个字符根据哈夫曼编码转换为对应的二进制编码,将编码入压缩文件中。 5. 解压缩:根据压缩文件和哈夫曼树进行解压缩,读取压缩文件的二进制编码,从哈夫曼树的根节点开始,根据编码的'0'或'1'选择左子树或右子树,直到叶子节点,即找到对应的字符,将字符入解压缩后的文件中。 以上是哈夫曼编码的压缩和解压缩的基本步骤,你可以参考提供的代码来实现具体的C语言程序。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [哈夫曼压缩与解压缩(c语言版)](https://blog.csdn.net/qq_42034205/article/details/101710602)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值