课程设计:C++实现哈夫曼编码

功能实现:

  • //1:先计算每个字符的权重
  • //2:构建哈夫曼树
  • //3:得出每个字符的哈夫曼编码。
  • //4:根据哈夫曼编码转化为字符

代码实现:

// 哈夫曼编码.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//1:先计算每个字符的权重
//2:构建哈夫曼树
//3:得出每个字符的哈夫曼编码。#include<iostream>
#include<string>
using namespace std;class node {
public:char value;int weight;//权重node* left;node* right;string code;//编码int zhi;node() {left = NULL;right = NULL;zhi = 0;weight = 0;}node( int a) {this->weight = a;}void showa() {cout << value<<"  "<< weight<<"  "<<code<<endl;}
};
void note(int notes[][26], string  target) {	//进行接受整理for (int i = 0; i < 26; i++) {//记录每个字母出现次数notes[0][i] = 97 + i;//将本中第一行都分别记录一个小写字母的编码,}for (char a : target) {//auto是一个占位符(auto a:target),根据后面的变量,自己推断自己是什么类型,用于变量类型很长for (int i = 0; i < 26; i++) {if (notes[0][i] == a) {notes[1][i]++;break;}}}
}
void chang_shuzu(node target1[],int& j,int notes[][26]) {//创建所需数组cout << "电文中出现的字符及其出现的次数如下" << endl;for (int i = 0; i < 26; i++) {if (notes[1][i] != 0) {cout << (char)notes[0][i] << ":" << notes[1][i] << endl;target1[j].value = (char)notes[0][i];//构建存储字符和权重的数组target1[j].zhi = 1;target1[j++].weight = notes[1][i];}}
}
void maopao(node target1[],int last,int farst) {//运用冒泡排序,将数组根据权重变成递增数组for (int i = farst; i < last-1; i++) {for (int j = farst; j < last- 1; j++) {if (target1[j].weight > target1[j + 1].weight) {node temp;temp = target1[j];target1[j] = target1[j + 1];target1[j + 1] = temp;}}}
}
void change_hafuma(node target1[],int &farst,node target2[],int &s) {//取出数组的前两个,将其投入到创建链表中,后来再将数组前两个删除,存入新结合的树target2[s].weight = target1[farst].weight + target1[farst + 1].weight;target2[s+1]= target1[farst];target2[s+2] = target1[farst + 1];target2[s].left = &target2[s+1];target2[s].right = &target2[s+2];farst++;target1[farst] = target2[s];s = s + 3;
}
void show(node* x,string h,node target3[],int &e) {//h为编码if (x->zhi==1) {//则此时指向的是叶子节点x->code = h;cout << x->value << ':' << h<<endl;target3[e].value = x->value;target3[e++].code = x->code;return;}show(x->left, h + "0", target3,e);show(x->right, h +"1", target3,e);
}
void show2(string target,node target3[],int last) {//展示电文对应编码cout << "电文对应编码为:" << endl;for (char a : target) {for (int i = 0; i < 100; i++) {if (a == target3[i].value) {cout << target3[i].code << " ";break;}}}cout << endl;}
void decode(node target3[],int last){string target;string p="";cout << "输入0-1二进制串(‘e’退出)";cin >> target;while (target!="e") {string he = "";for (char a : target) {he += a;for (int i = 0; i < last; i++) {if (he == target3[i].code) {p += target3[i].value;p += " ";he = "";break;}}}if (he != "") {cout << "编码错误,无法转换!"<<endl<<endl;}else{cout <<"编译转换的电文为:" << p<<endl << endl;}p = "";cout << "输入0-1二进制串(‘e’退出)";cin >> target;}
}
int main() {//接收端int notes[2][26] = { 0 };//令其初始都为0.cout << "输入电文:";string target;cin >> target;//用了for—each循环遍历note(notes,target);node target1[26];//初始记录有效节点node target2[100];//存储哈夫曼树所有节点node target3[26];//记录有效节点,此时其内节点中有每个节点的code值int last = 0;//指向最后一个有效数组元素的后一个int farst = 0;int s = 0;//存哈夫曼节点的数组chang_shuzu(target1, last, notes);//创建数组//构建哈夫曼树int z = 0;int e = 0;while (last - farst != 1) {maopao(target1,last,farst);change_hafuma(target1, farst,target2,s);}node x;x = target1[farst];cout << "电文中出现的字符的哈夫曼编码如下:"<<endl;show(&x, "",target3,e);show2(target,target3, last);cout << endl << endl;;decode(target3,last);
}

效果展示:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/149936.shtml

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

相关文章

【如何让你的建筑设计更高效】推荐7个3DMAX建筑设计的实用插件

3DMAX是创建具有复杂对象和照片级真实感材质的大型三维项目的绝佳工具。它有用于粒子模拟和参数化建模的内置工具&#xff0c;只要有足够的时间和练习&#xff0c;你就可以创建任何东西。然而&#xff0c;总有改进的余地。许多第三方开发人员已经发布了自己的扩展&#xff0c;也…

YOLOv8优化策略:轻量级Backbone改进 | VanillaNet极简神经网络模型 | 华为诺亚2023

🚀🚀🚀本文改进:一种极简的神经网络模型 VanillaNet,支持vanillanet_5, vanillanet_6, vanillanet_7, vanillanet_8, vanillanet_9, vanillanet_10, vanillanet_11等版本 🚀🚀🚀YOLOv8改进专栏:http://t.csdnimg.cn/hGhVK 学姐带你学习YOLOv8,从入门到创新,…

Spring高级bean的实例化方法

bean的实例化方法 构造方法 实例化bean第一种&#xff1a;使用默认无参构造函数(常用) 第二种创建bean实例&#xff1a;静态工厂实例化&#xff08;了解&#xff09; 第三种&#xff1a;实例工厂&#xff08;了解&#xff09;与FactoryBean&#xff08;实用&#xff09;

JVM判断对象是否存活之引用计数法、可达性分析

目录 前言 引用计数法 概念 优点 缺点 可达性分析 概念 缺点&#xff1a; 扩展&#xff1a; 1.GC Roots 概念 2.STW (Stop the world) 前言 JVM有两种算法来判断对象是否存活&#xff0c;分别是引用计数法和可达性分析算法&#xff0c;针对可达性分析算法STW时间长、…

【MySQL】_JDBC

目录 1. JDBC原理 2. 导入JDBC驱动包 3. 编写JDBC代码实现Insert 3.1 创建并初始化一个数据源 3.2 和数据库服务器建立连接 3.3 构造SQL语句 3.4 执行SQL语句 3.5 释放必要的资源 4. JDBC代码的优化 4.1 从控制台输入 4.2 避免SQL注入的SQL语句 5. 编写JDBC代码实现…

〖大前端 - 基础入门三大核心之JS篇㊲〗- DOM改变元素节点的css样式、HTML属性

说明&#xff1a;该文属于 大前端全栈架构白宝书专栏&#xff0c;目前阶段免费&#xff0c;如需要项目实战或者是体系化资源&#xff0c;文末名片加V&#xff01;作者&#xff1a;不渴望力量的哈士奇(哈哥)&#xff0c;十余年工作经验, 从事过全栈研发、产品经理等工作&#xf…

Python数据分析实战① Python实现数据可视化

文章目录 一、数据可视化介绍二、matplotlib和pandas画图1.matplotlib简介和简单使用2.matplotlib常见作图类型3.使用pandas画图4.pandas中绘图与matplotlib结合使用 三、订单数据分析展示四、Titanic灾难数据分析显示 一、数据可视化介绍 数据可视化是指将数据放在可视环境中…

.Net中Redis的基本使用

前言 Redis可以用来存储、缓存和消息传递。它具有高性能、持久化、高可用性、扩展性和灵活性等特点&#xff0c;尤其适用于处理高并发业务和大量数据量的系统&#xff0c;它支持多种数据结构&#xff0c;如字符串、哈希表、列表、集合、有序集合等。 Redis的使用 安装包Ser…

wpf devexpress 排序、分组、过滤数据

这个教程示范在GridControl如何排序数据&#xff0c;分组数据给一个行创建一个过滤。这个教程基于前一个教程。 排序数据 可以使用GridControl 排序数据。这个例子如下过滤数据对于Order Date 和 Customer Id 行&#xff1a; 1、对于Order Date 和 Customer Id 行指定Colum…

Linux虚拟机中网络连接的三种方式

Linux 虚拟机中网络连接的三种方式 先假设一个场景&#xff0c;在教室中有三个人&#xff1a;张三、李四和王五&#xff08;这三个人每人有一台主机&#xff09;&#xff0c;他们三个同处于一个网段中&#xff08;192.169.0.XX&#xff09;&#xff0c;也就是说他们三个之间可…

深度学习_13_YOLO_图片切片及维度复原

需求&#xff1a; 在对获取的图片进行识别的时候&#xff0c;如果想减少不必要因素的干扰&#xff0c;将图片切割只对有更多特征信息的部分带入模型识别&#xff0c;而剩余有较多干扰因素的部分舍弃&#xff0c;这就是图片切割的目的&#xff0c;但是又由于模型对图片的维度有较…

Spring Cloud学习(十)【Elasticsearch搜索功能 分布式搜索引擎02】

文章目录 DSL查询文档DSL查询分类全文检索查询精准查询地理坐标查询组合查询相关性算分Function Score Query复合查询 Boolean Query 搜索结果处理排序分页高亮 RestClient查询文档快速入门match查询精确查询复合查询排序、分页、高亮 黑马旅游案例 DSL查询文档 DSL查询分类 …

QT day3作业

1.思维导图 2、 完善对话框&#xff0c;点击登录对话框&#xff0c;如果账号和密码匹配&#xff0c;则弹出信息对话框&#xff0c;给出提示”登录成功“&#xff0c;提供一个Ok按钮&#xff0c;用户点击Ok后&#xff0c;关闭登录界面&#xff0c;跳转到其他界面 如果账号和密…

不懂找伦敦银趋势?3个方法搞定

趋势是我们的朋友&#xff0c;但是这个朋友却很喜欢跟我们开玩笑&#xff0c;如果我们不留意&#xff0c;根本发觉不了它的存在。怎么找到趋势本体并且和它做个好朋友呢&#xff1f;下面我们就来介绍三个方法。 数波段的高点和低点。我们以当前的市场波动价格为轴&#xff0c;向…

IDEA中更换java项目JDK

我们打开IDEA 打开项目 然后选择 File 下的 Project Structure 这里 我们下拉选择自己需要的JDK Sources这里 也要设置一下JDK对应版本 然后 上面这个 Project 中 也要设置一下对应jdk的版本 保持一直 然后 我们打开 File 下的 Settings 然后 找到如下图配置 如果JKD版本看…

深度学习人体语义分割在弹幕防遮挡上的实现 - python 计算机竞赛

文章目录 1 前言1 课题背景2 技术原理和方法2.1基本原理2.2 技术选型和方法 3 实例分割4 实现效果5 最后 1 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 深度学习人体语义分割在弹幕防遮挡上的应用 该项目较为新颖&#xff0c;适合作为竞…

Unity Meta Quest 一体机开发(七):配置玩家 Hand Grab 功能

文章目录 &#x1f4d5;教程说明&#x1f4d5;玩家物体配置 Hand Grab Interactor⭐添加 Hand Grab Interactor 物体⭐激活 Hand Grab Visual 和 Hand Grab Glow⭐更新 Best Hover Interactor Group &#x1f4d5;配置可抓取物体&#xff08;无抓取手势&#xff09;⭐刚体和碰撞…

DDPM的学习

Denoising Model 首先是宏观理解一下 Denoising Model 的输入 去噪很多步&#xff0c;用的是同一个Denoising Model&#xff0c;但是输入图片可能差距很大。解决方法&#xff1a;给Denoising Model多输入一个变量&#xff0c;表示现在的去噪阶段&#xff0c;让Denoising Mod…

解决requests 2.28.x版本SSL错误:证书验证失败

1、问题背景 在使用requests 2.28.1版本时&#xff0c;我进行HTTP post传输报告负载时&#xff0c;由于SSL验证设置为True&#xff0c;请求失败&#xff0c;错误如下&#xff1a;(Caused by SSLError(SSLCertVerificationError(1, ‘[SSL: CERTIFICATE_VERIFY_FAILED] certifi…

ChatGPT最强?文心一言与ChatGPT对比

对于同一个问题我们分别对文心一言3.5和ChatGPT3.5输出回答&#xff0c;结果如下图&#xff0c;可以看到文心一言的回答更好&#xff0c;文心一言是由百度开发的人工智能语言模型&#xff0c;它的中文理解能力主要是基于百度强大的搜索引擎和自然语言处理技术。文心一言更加注重…