首页 > 编程语言 >哈夫曼编码和解码(c++实现)

哈夫曼编码和解码(c++实现)

时间:2023-11-22 21:15:22浏览次数:43  
标签:编码 哈夫曼 int s2 解码 HT c++ s1

给一篇英文文章(text),统计各字符出现(仅需包括英文大小写字母)次数。
1) 输出每个字符出现的次数,并进行Huffman树构造,将每个字符的编码存入到文件code1.txt。
2) 输出字符串”Data Structure”的编码。
3) 将英文文章前4段的Huffman编码保存到文件code2.txt。
4) 实现解码功能, 对文章的前2段进行解码。

 1 //哈夫曼树
 2 void HufCode()
 3 {
 4     //52个叶结点+1个最大结点(便于找最小值)
 5     HTNode HT[104];
 6 
 7     //初始化结点
 8     initHT(HT);
 9 
10     //创建哈夫曼树
11     for (int i = 53; i < 2 * 52; i++)
12     {
13         int s1 = 0;
14         int s2 = 0;
15         //在1-i-1区间里面找两个parent=0等权值最小的s1,s2
16         select_two_small(HT, i - 1, s1, s2);
17 
18         //建树
19         HT[s1].parent = HT[s2].parent = i;
20         HT[i].lchild = s1;
21         HT[i].rchild = s2;
22         HT[i].weight = HT[s1].weight + HT[s2].weight;
23     }
24 
25     //从叶节点到根节点获取
26     char temp[53]={0};
27     //分配临时空间存储编码
28     for (int i = 1; i <= 52; i++)
29     {
30         int start = 0;
31         //一个孩子c和一个父亲f,一直往上遍历
32         for (int c = i, f = HT[i].parent; f != 0; c = f, f = HT[f].parent)
33         {
34             if (HT[f].lchild == c)
35                 temp[start++] = '1';
36             else if (HT[f].rchild == c)
37                 temp[start++] = '0';
38         }
39         temp[start++] = '\0';
40         reverseS(temp,start);//翻转才是要的编码
41         strcpys(i, temp,start);
42     }
43 }

这些就行了

标签:编码,哈夫曼,int,s2,解码,HT,c++,s1
From: https://www.cnblogs.com/saucerdish/p/17850294.html

相关文章

  • C/C++ 实现Windows注册表操作
    Windows注册表(Registry)是Windows操作系统中用于存储系统配置信息、用户设置和应用程序数据的一个集中式数据库。它是一个层次结构的数据库,由键(Key)和值(Value)组成,这些键和值被用于存储各种系统和应用程序的配置信息。以下是注册表的一些基本概念:键(Key):注册表中的数据结构,类似于文......
  • 159.102 C++问题求解
    一家生产纽扣的工厂给了你一份合同。工厂识别损坏的按钮,使其不会提供给商店。这家工厂有一台可以拍摄纽扣的照片。这台相机只能用黑白(没有颜色),分辨率不是很高很好,但这不是问题。你的工作是编写一个C++程序,识别照片中任何损坏的按钮。你需要生成一个图像,在每个按钮周围显示一个框。......
  • ISOM 3029 - Computer Programming Using C++
    以下是C++程序的问题。作业的硬拷贝和软拷贝都应按时提交。全部的程序(.cpp文件)将被压缩并上传到“提交作业1”按钮。压缩文件应与您的学生一起命名编号,例如“ba12345_Ass1.zip”。问题1:彩票计划(50%)编写一个C++程序,在开始时输出一条问候信息,然后生成6个肯定信息对于彩票游......
  • 【笔记】C++系列02:连续的作用域解析运算符::的场景有哪些?
    在C++中,可以使用连续的作用域解析运算符::来访问嵌套的命名空间、类和类成员。这种用法通常在以下场景下出现:命名空间嵌套:当命名空间中存在嵌套的命名空间时,可以使用连续的作用域解析运算符来访问内层命名空间中的成员。例如:namespaceA{namespaceB{namespac......
  • C++ MiniZip实现目录压缩与解压
    Zlib是一个开源的数据压缩库,提供了一种通用的数据压缩和解压缩算法。它最初由Jean-LoupGailly和MarkAdler开发,旨在成为一个高效、轻量级的压缩库,其被广泛应用于许多领域,包括网络通信、文件压缩、数据库系统等。其压缩算法是基于DEFLATE算法,这是一种无损数据压缩算法,通常能够提供......
  • 不同解码策略
    不同解码策略https://www.cnblogs.com/miners/p/14950681.htmlhttps://blog.csdn.net/taoqick/article/details/123897960https://zhuanlan.zhihu.com/p/442557114......
  • L1-8 阅览室 (20 分)(C/C++)
    天梯图书阅览室请你编写一个简单的图书借阅统计程序。当读者借书时,管理员输入书号并按下S键,程序开始计时;当读者还书时,管理员输入书号并按下E键,程序结束计时。书号为不超过1000的正整数。当管理员将0作为书号输入时,表示一天工作结束,你的程序应输出当天的读者借书次数和平均阅读时间......
  • C/C++ 使用API实现数据压缩与解压缩
    在Windows编程中,经常会遇到需要对数据进行压缩和解压缩的情况,数据压缩是一种常见的优化手段,能够减小数据的存储空间并提高传输效率。Windows提供了这些API函数,本文将深入探讨使用WindowsAPI进行数据压缩与解压缩的过程,主要使用ntdll.dll库中的相关函数。关键函数介绍RtlGetComp......
  • 实例讲解C++连接各种数据库,包含SQL Server、MySQL、Oracle、ACCESS、SQLite 和 Postgr
     C++是一种通用的编程语言,可以使用不同的库和驱动程序来连接各种数据库。以下是一些示例代码,演示如何使用C++连接SQLServer、MySQL、Oracle、ACCESS、SQLite和PostgreSQL、MongoDB数据库。连接SQLServer数据库要使用C++连接SQLServer数据库,可以使用Micro......
  • mysql c++ create table,insert,select
    CREATETABLE`t1`(`id`bigintunsignedNOTNULLAUTO_INCREMENTprimarykey,`author`varchar(40)NOTNULLDEFAULT'',`comment`varchar(40)NOTNULLDEFAULT'',`content`varchar(40)NOTNULLDEFAULT'',`header`......