#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++输出哈夫曼编码的更多相关文章

  1. 采用C++实现哈夫曼树的创建并输出哈夫曼编码

    一.这篇随笔来自一道信息论的作业题,因为手动编码过于复杂,所以想到了编程解决,原题目如下图所示: 二.源代码如下: #include <iostream> #include <str ...

  2. [C++]哈夫曼树(最优满二叉树) / 哈夫曼编码(贪心算法)

    一 哈夫曼树 1.1 基本概念 算法思想 贪心算法(以局部最优,谋求全局最优) 适用范围 1 [(约束)可行]:它必须满足问题的约束 2 [局部最优]它是当前步骤中所有可行选择中最佳的局部选择 3 [ ...

  3. HDU2527 哈夫曼编码

    Safe Or Unsafe Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)To ...

  4. YTU 3027: 哈夫曼编码

    原文链接:https://www.dreamwings.cn/ytu3027/2899.html 3027: 哈夫曼编码 时间限制: 1 Sec  内存限制: 128 MB 提交: 2  解决: 2 ...

  5. 使用F#来实现哈夫曼编码吧

    最近算法课要求实现哈夫曼编码,由于前面的问题都是使用了F#来解决,偶然换成C#也十分古怪,报告也不好看,风格差太多.一开始是打算把C#版本的哈夫曼编码换用F#来写,结果写到一半就觉得日了狗了...毕竟 ...

  6. hdu2527哈夫曼编码

    /* Safe Or Unsafe Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) T ...

  7. 【视频编解码·学习笔记】7. 熵编码算法:基础知识 & 哈夫曼编码

    一.熵编码概念: 熵越大越混乱 信息学中的熵: 用于度量消息的平均信息量,和信息的不确定性 越是随机的.前后不相关的信息,其熵越高 信源编码定理: 说明了香农熵越信源符号概率之间的关系 信息的熵为信源 ...

  8. 基于哈夫曼编码的文件压缩(c++版)

    本博客由Rcchio原创 我了解到很多压缩文件的程序是基于哈夫曼编码来实现的,所以产生了自己用哈夫曼编码写一个压缩软件的想法,经过查阅资料和自己的思考,我用c++语言写出了该程序,并通过这篇文章来记录 ...

  9. 【Matlab编程】哈夫曼编码的Matlab实现

    在前年暑假的时候,用C实现了哈夫曼编译码的功能,见文章<哈夫曼树及编译码>.不过在通信仿真中,经常要使用到Matlab编程,所以为了方便起见,这里用Matlab实现的哈夫曼编码的功能.至于 ...

随机推荐

  1. 树莓派4B踩坑指南 - (4)输入法和字体

    输入法和字体 fcitx 安装谷歌输入法和sunpinyin,哪个不用可以装完卸载: sudo apt-get install fcitx fcitx-googlepinyin fcitx-modul ...

  2. vector的clear和swap

    vector的clear()操作只是清空vector的元素,而不会将内存释放掉 vector<int> vec1{ 1,2,3,4,5 }; vec1.clear(); cout<& ...

  3. UniGui安装(01)

    UniGui安装.Delphi10和uniGUI1.90.0.1509 1]下载 2]安装 3]目录说明 1]下载 在我百度网盘里  uniGUI1-90-0-1509.zip https://pan ...

  4. apache服务器本质上说是一个TCP socket服务

    apache服务器本质上说是一个TCP socket服务,socket模型如下:  下面以worker MPM来说明apache代码中相应处理的位置在哪里: (以apache httpd 2.2.23 ...

  5. HTML元素和测试用例的简要介绍

    HTML和CSS的基本语法就不出教程,线下自己看电子书即可 HTML元素 标签 内容 属性 标签+内容+属性 <html> <head> <title>我的主页&l ...

  6. 吴裕雄 Bootstrap 前端框架开发——Bootstrap 表格:响应式表格

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  7. DeepLearning算法文章

    算法源码: learn_dl : https://github.com/hanbt/learn_dl rnn-from-scratch : https://github.com/pangolulu/r ...

  8. .net设置浏览器缓存和跨域的几种方法

    .自定义过滤器属性 public class NoCacheAttribute : FilterAttribute, IActionFilter { public void OnActionExecu ...

  9. (3)LoraWAN:链路控制、SF BW CR

    三.Introduction on LoRaWAN options 本文件描述了一种用于可为移动的或固定在一个固定位置的电池供电的终端设备而优化的LoRaWAN™网络协议.LORA™是一个由Semte ...

  10. 容器STL

    一.迭代器iterator 迭代器是容器的一种遍历方式,每种容器都定义了自己的迭代器类型 声明一个迭代器: 容器名称<数据类型>::iterator 迭代器名称 vector<int ...