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实现的哈夫曼编码的功能.至于 ...
随机推荐
- nopad++将制表符替换为换行符
将制表符换位换行
- FFmpeg RTSP流通过UDP传输问题
我自己在使用SRS服务的Ingest功能时发现在读取一个网络摄像头的RTSP流时一直不成功, 具体分析后发现SRS在调用FFmpeg时出了问题: /usr/local/ffmpeg/bin/ffmpe ...
- leetcode209 Minimum Size Subarray Sum
""" Given an array of n positive integers and a positive integer s, find the minimal ...
- CyclicBarrier 解读
简介 字面上的意思: 可循环利用的屏障. 作用: 让所有线程都等待完成后再继续下一步行动. 举例模拟: 吃饭人没到齐不准动筷. 使用Demo package com.ronnie; import ja ...
- rendering path定义了什么?有哪些?有什么作用?有什么限制?
rendering path 定义了光照在一个shader pass中处理的对象与顺序,如逐像素处理,逐顶点处理,向前处理,后向 deferred用于处理不透明物体,会先把它们根据深度检测,过滤后的内 ...
- Spring之byte[]传输
事出原因 某些原因,需要在在服务之间传输文件,想到只有通过Byte数组,或者是Stream传递,遂定下两方法,一个byte,一个inpustream,老样子,upload(@RequestParam( ...
- JAVA 数据库操作工具类----sqllite
package com.asc.db; import android.content.ContentValues; import android.content.Context; import and ...
- Android 获取当前日期距离过期时间的日期差值的完整方法直接使用
/*** * 获取当前日期距离过期时间的日期差值 * @param endTime * @return */public String dateDiff(String endTime) { Strin ...
- wyh的dp入门刷题笔记
0: 靠前感觉之前dp抄题解都是抄的题解,自己从没有真正理解过dp.wyh下了很大决心从头学dp,于是便有了这篇文章. 1.背包 前四讲01背包&多重背包&完全背包(混合背包) :樱花 ...
- [Educational Codeforces Round 81 (Rated for Div. 2)]E. Permutation Separation(线段树,思维,前缀和)
[Educational Codeforces Round 81 (Rated for Div. 2)]E. Permutation Separation(线段树,思维,前缀和) E. Permuta ...