哈夫曼编码

哈夫曼编码

  • 字符都有ASC2码,长度一样,占用空间一样。根据字符使用频率编码可以省空间,就是哈夫曼编码。
  • 统计每个字符出现的频率,插入队列中。
  • 降序排序该队列。
  • 取出最小的两个节点合并成父节点插入队列里。该两节点和父节点形成一个二叉树。
  • 重复3、4过程,使队列仅剩一个节点。该节点是最后的根,前面生成的二叉树都是该二叉树的节点。
  • 叶子节点就是字符。
  • 左树0,右树1,从根到叶子节点就会生成由0、1组成的码,就是哈夫曼编码,

队列生成二叉树过程

在这里插入图片描述

生成的哈夫曼编码

在这里插入图片描述

代码

#include <bits/stdc++.h>
using namespace std;
string s=“All roads lead to Rome.”;
int sl;//输入字符串长度
//根据每个字符出现的频率,生成对应的哈夫曼编码
struct node{
char c;//字符
int cx,d;//字符ASC2值和出现的频率
string s,s1;//哈夫曼编码和合并后的字母
node *fa,*left,*right;//父和左右子树
node(){//无参数初始化
d=0,s=s1=“”;
left=right=fa=NULL;
}
node(char x){
d=0,c=x,cx=int(x),s=“”,s1=x;
left=right=fa=NULL;
}
node(node *a1,node *a2){//合并两节点。变成该节点的左右子树
d=a1->d+a2->d;s1=a1->s1+a2->s1;
a1->fa=a2->fa=this;
left=a1,right=a2;
}
}a[256],//共256个字符,每个都是节点(取地址)。
*n1,*n2// 左右节点都用指针
,head;//哈夫曼树的根
vector<node
> v;//指针容器
void mk(node *x,string s){//生成编码过程,
if(x->left)mk(x->left,s+‘0’);//左0到
if(x->right)mk(x->right,s+‘1’);//右1,
x->s=s;//非左右树就是叶节点,就是字符,需要编码
}
bool cmp(const node *a,const node *b){//指针数组排序函数
return a->d>b->d;
}
bool cmp2(node a,node b){//所有字符的结构体数组排序函数
return a.s.length()<b.s.length();
}
int main(){
//freopen(“data.cpp”,“r”,stdin);
//getline(cin,s);
sl=s.length();
for(int i=0;i<265;i++)a[i]=node{char(i)};//每个字符结构体初始化
for(int i=0;i<sl;i++)a[int(s[i])].d++;//每个字符出现频率计算
for(int i=0;i<265;i++)//只要出现的字符就放进队列里
if(a[i].d)v.push_back(&a[i]);
while(!v.empty()){//一直到清空队列,
if(v.size()==1){//剩下一个元素作为根
head=v.back();v.pop_back();break;
}else{//排序,取出最小两个节点合并成一个节点,作为树放进队列
sort(v.begin(),v.end(),cmp);
n1=v.back();v.pop_back(); n2=v.back();v.pop_back();
for(int i=0;i<v.size();i++)cout<<v[i]->s1<<“,”<<v[i]->d<<“|”;
cout<<endl;
node *f=new node(n1,n2);
v.push_back(f);
}
}
cout<<s<<endl;
mk(head,“”);//递归,生成编码
sort(a+0,a+256,cmp2);//排序
for(int i=0;i<256;i++){
if(a[i].d)cout<<a[i].c<<“\t”<<a[i].d<<“\t”<<a[i].s<<endl;
}
return 0;
}

小结

别慌,别急, 有些概念光听一听,挺吓人的,真的做好慢慢去做还真能做出来。

资源下载链接为: https://pan.quark.cn/s/d9ef5828b597 在 IT 领域,我们有时需要清理系统中不再需要的软件,比如 OneKey 一键还原。OneKey 是一款常见的 Windows 系统备份与还原工具,但当用户不再使用它时,可能会面临卸载难题。通常的卸载方法可能无法完全清除 OneKey,因为它的某些组件可能隐藏在系统各处。 在开始卸载之前,要先关闭所有 OneKey 的进程,可通过任务管理器来完成这一步。接着打开控制面板,找到程序和功能选项,尝试从这里卸载 OneKey,这是常规的卸载方式。如果在控制面板的卸载程序列表里找不到 OneKey,那就得手动查找它的安装位置。一般情况下,软件的安装目录位于 C 盘的 Program Files 或 Program Files (x86) 文件夹中。进入 OneKey 的安装目录,寻找卸载程序或脚本并执行,以此启动卸载流程。 在卸载过程中,可能会碰到注册表项的问题。OneKey 安装时会在注册表中添加许多键值,这些键值在常规卸载后可能还存在,从而导致残留文件和错误消息。所以,卸载完成后需要手动清理注册表。不过,修改注册表是存在一定风险的,误删可能会引发系统问题。因此,在动手之前最好备份注册表或整个系统。打开注册表编辑器(regedit),搜索与 OneKey 相关的键值,比如程序名称、作者等,然后安全地将它们删除。 此外,OneKey 可能在启动项中设置了自启动项,这会导致即使卸载后,程序仍能在开机时运行。打开系统配置(msconfig),在启动选项里查找并禁用或删除 OneKey 的相关条目。 如果按照上述步骤操作后仍无法彻底卸载 OneKey,可以考虑使用专业的卸载工具,例如 Revo Uninstaller。这类工具能够深度扫描并清理程序留下的痕迹,有助于完全卸载 OneKey。如果手头有
标题SpringBoot基于JAVA的旅游微信小程序设计与实现AI更换标题第1章引言介绍旅游微信小程序的研究背景、意义,以及基于SpringBoot和JAVA的开发优势。1.1研究背景与意义阐述旅游微信小程序在当前市场环境下的需求和价值。1.2SpringBoot与JAVA技术概述简述SpringBoot框架的特点及JAVA语言在开发中的优势。1.3论文研究内容与创新点概述论文的主要研究内容、目标及创新之处。第2章相关理论与技术基础总结微信小程序、SpringBoot及JAVA的相关理论和技术要点。2.1微信小程序开发原理介绍微信小程序的基本架构、开发流程和关键技术。2.2SpringBoot框架核心特性详细阐述SpringBoot的核心特性,如自动配置、依赖管理等。2.3JAVA语言特性及应用分析JAVA语言的特点及其在微信小程序开发中的应用。第3章系统需求分析与设计对旅游微信小程序进行需求分析,并提出相应的设计方案。3.1用户需求分析从用户角度出发,分析旅游微信小程序的功能需求。3.2系统功能设计根据需求分析,设计旅游微信小程序的功能模块和交互流程。3.3数据库设计设计支撑旅游微信小程序运行的数据库结构。第4章系统实现与关键技术详细阐述旅游微信小程序的实现过程及所涉及的关键技术。4.1开发环境搭建介绍开发环境的配置和搭建过程。4.2功能模块实现分别阐述各个功能模块的实现细节,包括代码编写、界面设计等。4.3关键技术解析对实现过程中涉及的关键技术进行详细解析,如数据交互、安全性保障等。第5章系统测试与优化对实现的旅游微信小程序进行系统测试,并针对测试结果进行优化。5.1测试方法与环境介绍系统测试的方法、流程和测试环境。5.2测试结果分析对测试结果进行详细分析,包括功能测试、性能测试等。5.3系统优化措施根据测试结果,提出针对性的系统优化措施。第6章结论与展望总结论文的研究
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值