c++输出哈夫曼编码
#include<iostream>
#include<string>
using namespace std;
struct huffTree
{
int parent;
int lchild;
int rchild;
int weight;
string flag;
};
struct Lowest_Node//第0级节点的字符与频度
{
char ch;
int ch_num;
};
void coding(int length,huffTree tree[],int n,int &a,int &b)
{
int i;
int r,s;
r=s=length;//节点个数不会超过字符的长度
for(i=;i<n;i++)
{
if((tree[i].weight<r)&&(tree[i].parent==-))
{
r=tree[i].weight;
a=i;
}
}
for(i=;i<n;i++)
{
if((tree[i].weight<s)&&(i!=a)&&(tree[i].parent==-))
{
s=tree[i].weight;
b=i;
}
}
}
//第二部分是核心函数,frequency()的重点是计算每个字符出现的频度,从大到小排序其频度
void frequency(string str)
{
int length=str.length(); //长度
Lowest_Node *node=new Lowest_Node[length]; //声明最0级节点
int i,j; //循环因子
for(i=;i<length;i++)
node[i].ch_num=; //初始化频度
int char_type_num=; //初始化为种字符
for(i=;i<length;i++)
{
for(j=;j<char_type_num;j++)
if(str[i]==node[j].ch||(node[j].ch>='a'&&node[j].ch<='z'&&str[i]+==node[j].ch))
break;
if(j<char_type_num)
node[j].ch_num++;
else
{
if(str[i]>='A'&&str[i]<='Z')
node[j].ch=str[i]+;
else
node[j].ch=str[i];
node[j].ch_num++;
char_type_num++;
}
}
//按频度从小到大排序
for(i=;i<char_type_num;j++)
{
for(j=i;j<char_type_num;j++)
{
if(node[j].ch_num<node[j+].ch_num)//如果前一个小于后面的交换
{
int temp;//临时频度
char ch_temp;//临时字符
temp=node[j].ch_num;
ch_temp=node[j].ch;
node[j].ch_num=node[j+].ch_num;
node[j].ch=node[j+].ch;
node[j+].ch_num=temp;
node[j+].ch=ch_temp;
}
}
}
for(i=;i<char_type_num;i++)
cout<<"字符"<<node[i].ch<<"出现了"<<node[i].ch_num<<"次"<<endl;
huffTree *huff=new huffTree[*char_type_num-];//此变量的声明需要确定char_type_num值后
huffTree temp;
string *code=new string[*char_type_num-];//存放各个字符的编码
for(i=;i<*char_type_num-;i++) //节点初始化
{
huff[i].lchild=-;
huff[i].parent=-;
huff[i].rchild=-;
huff[i].flag=-;
}
for(j=;j<char_type_num;j++)//将排序后的第0级节点权重赋值给树节点
{
huff[j].weight=node[j].ch_num;
}
int min1,min2;
for(int k=char_type_num;k<*char_type_num-;k++)
{
coding(length,huff,k,min1,min2);
huff[min1].parent=k;
huff[min2].parent=k;
huff[min1].flag="";
huff[min2].flag="";
huff[k].lchild=min1;
huff[k].rchild=min2;
huff[k].weight=huff[min1].weight+huff[min2].weight;
}
for(i=;i<char_type_num;i++)
{
temp=huff[i];
while()
{
code[i]=temp.flag+code[i];
temp=huff[temp.parent];
if(temp.parent==-)
break;
}
}
cout<<"字符串的每个字符的编码是:"<<endl;
for(i=;i<char_type_num;i++)
cout<<node[i].ch<<" "<<code[i]<<endl;
cout<<"整个字符串的哈夫曼编码是:"<<endl;
for(i=;i<length;i++)
{
for(j=;j<char_type_num;j++)
{
if(str[i]==node[j].ch)
cout<<code[j];
}
}
//释放内存
delete[] node;
node=NULL;
delete[] huff;
huff=NULL;
delete[] code;
code=NULL;
}
//第三部分是代码实现mian函数的部分
int main()
{
int length=;//字符长度
string str;//目标 字符串
cout<<"请输入第一个字符串:"<<endl;
cin>>str;
frequency(str); //求各个元素的频度
return ;
}
c++输出哈夫曼编码的更多相关文章
- 采用C++实现哈夫曼树的创建并输出哈夫曼编码
一.这篇随笔来自一道信息论的作业题,因为手动编码过于复杂,所以想到了编程解决,原题目如下图所示: 二.源代码如下: #include <iostream> #include <str ...
- [C++]哈夫曼树(最优满二叉树) / 哈夫曼编码(贪心算法)
一 哈夫曼树 1.1 基本概念 算法思想 贪心算法(以局部最优,谋求全局最优) 适用范围 1 [(约束)可行]:它必须满足问题的约束 2 [局部最优]它是当前步骤中所有可行选择中最佳的局部选择 3 [ ...
- HDU2527 哈夫曼编码
Safe Or Unsafe Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)To ...
- YTU 3027: 哈夫曼编码
原文链接:https://www.dreamwings.cn/ytu3027/2899.html 3027: 哈夫曼编码 时间限制: 1 Sec 内存限制: 128 MB 提交: 2 解决: 2 ...
- 使用F#来实现哈夫曼编码吧
最近算法课要求实现哈夫曼编码,由于前面的问题都是使用了F#来解决,偶然换成C#也十分古怪,报告也不好看,风格差太多.一开始是打算把C#版本的哈夫曼编码换用F#来写,结果写到一半就觉得日了狗了...毕竟 ...
- hdu2527哈夫曼编码
/* Safe Or Unsafe Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) T ...
- 【视频编解码·学习笔记】7. 熵编码算法:基础知识 & 哈夫曼编码
一.熵编码概念: 熵越大越混乱 信息学中的熵: 用于度量消息的平均信息量,和信息的不确定性 越是随机的.前后不相关的信息,其熵越高 信源编码定理: 说明了香农熵越信源符号概率之间的关系 信息的熵为信源 ...
- 基于哈夫曼编码的文件压缩(c++版)
本博客由Rcchio原创 我了解到很多压缩文件的程序是基于哈夫曼编码来实现的,所以产生了自己用哈夫曼编码写一个压缩软件的想法,经过查阅资料和自己的思考,我用c++语言写出了该程序,并通过这篇文章来记录 ...
- 【Matlab编程】哈夫曼编码的Matlab实现
在前年暑假的时候,用C实现了哈夫曼编译码的功能,见文章<哈夫曼树及编译码>.不过在通信仿真中,经常要使用到Matlab编程,所以为了方便起见,这里用Matlab实现的哈夫曼编码的功能.至于 ...
随机推荐
- dp - 活动选择问题
算法目前存在问题,待解决.. 活动选择问题是一类任务调度的问题,目标是选出一个最大的互相兼容的活动集合.例如:学校教室的安排问题,几个班级需要在同一天使用同一间教室,但其中一些班级的使用时间产生冲突, ...
- css怎样让元素显示指定的宽高比
.father { width: 100% } .child {; padding-bottom: 20%; background: green; overflow: hidden; } <bo ...
- Java连载78-深入自动拆装箱、Date类和SimpleDateFormat格式化
一.深入自动拆装箱 1.直接举例: public class D78_AutomaticUnpackingAndPacking{ public static void main(String[] ar ...
- Spring Schedule 实现定时任务
很多时候我们都需要为系统建立一个定时任务来帮我们做一些事情,SpringBoot 已经帮我们实现好了一个,我们只需要直接使用即可,当然你也可以不用 SpringBoot 自带的定时任务,整合 Quar ...
- mysql学习指令
mysql 用户管理和权限设置 参考文章:http://www.cnblogs.com/fslnet/p/3143344.html Mysql命令大全 参考文章: http://www.cnblogs ...
- js读取本地json/txt/xml存在跨越问题,可以用jsonp 读取本地json文件
想自己用 js写一个原生的ajax请求,访问本地文件,json/txt.但是demo,写了一个后,发现 原来是跨域了. js 写的原生ajax 请求代码如下 html代码 <div id=&qu ...
- linux的切换目录操作
cd 是 change directory 用法 cd [目录名] 几个特殊目录: ”.“或者”./“当前目录 ”..“或者"../"上级目录 “../ ...
- Burp Suite Pro1.7.36破解版
百度网盘下载(H大会一直更新):链接: https://pan.baidu.com/s/1brjPKM7 密码: 9v4r 爱盘下载:https://down.52pojie.cn/Tools/Net ...
- C 语言入门---第六章 C语言数组
数组就是一些列具有相同类型的数据的集合,这些数据在内存中一次挨着存放,彼此之间没有缝隙. 我们可以将二维数组看作一个Excel表格,有行有列,length1 表示行数,length2 表示列数,要在二 ...
- 实时监听input输入的变化(兼容主流浏览器)
遇到如此需求,首先想到的是change事件,但用过change的都知道只有在input失去焦点时才会触发,并不能满足实时监测的需求,比如监测用户输入字符数. 在经过查阅一番资料后,欣慰的发现firef ...