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实现的哈夫曼编码的功能.至于 ...
随机推荐
- 解题报告:luogu P1196 [NOI2002]银河英雄传说
由于并查集让我很自闭(其实是我太弱了),所以学习了加权并查集,这是例题: 题目链接:P1196 [NOI2002]银河英雄传说 不是很简单,但对于大佬还是签到题. 合并与路径压缩时直接维护\(dis[ ...
- php实现简单链式操作mysql数据库类
<?php $dbConfig = require_once(dirname(__FILE__).'/config.php'); class Db{ public $conn; ...
- C# String 字符串一些关键理解
#1 :在.Net Framework中,字符总是表示成16位Unicode的代码#2 :String 和string 其实是一样的只是表现形式上不同#3 :string类型被视为基元类型,也就是编译 ...
- 「APIO2012」派遣
「APIO2012」派遣 传送门 当预算超过限制时,优先丢掉薪水高的忍者(左偏树维护一下),然后答案取合法答案的最大值. 参考代码: #include <algorithm> #inclu ...
- 【JAVA蓝桥杯】基础练习2 十六进制转十进制
资源限制 时间限制:1.0s 内存限制:512.0MB 问题描述 从键盘输入一个不超过8位的正的十六进制数字符串,将它转换为正的十进制数后输出. 注:十六进制数中的10~15分别用大写的英文字母A ...
- 如何使用gcc_clang进行C语言的编译_编译的流程是什么?
编译命令 gcc/clang -g -O2 -o -c test test.c -I... -L... -l -g : 输出文件中的调试信息 -O : 对输出文件做出指令优化,默认是O1, O2优化更 ...
- 图层CALayer的使用
1.图层的意义 当UIView需要显示到屏幕上时,会调用drawRect:方法进行绘图,并且会将所有内容绘制在自己的图层上,绘制完毕后,系统会将图层拷贝到屏幕上,于是就完成了UIView的显示. ...
- sklearn中调用集成学习算法
1.集成学习是指对于同一个基础数据集使用不同的机器学习算法进行训练,最后结合不同的算法给出的意见进行决策,这个方法兼顾了许多算法的"意见",比较全面,因此在机器学习领域也使用地非常 ...
- 2016 黑客必备的Android应用都有哪些?
免责声明:本站所发布的此份清单仅供学习之用.我们不支持读者利用其中的任何工具进行任何不道德的恶意攻击行为. 根据业界的一系列评测以及亲身经验,我们整理出了这份最佳Android黑客应用清单.除了对应用 ...
- Cookie跨域setDomain和setPath
CSDN日报20170226--<你离心想事成只差一个计划> 程序员2月书讯 [招募]Python学习班招生啦 Cookie跨域setDomain和setPath 标签: cookiesp ...