Huffman编码问题

fantasyfans fantasyfans 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
#include<iostream.h>
#include<iomanip.h>
#include<string.h>
const MAX=1000;
int i,j;
class Node
{
public:
char data;
int weight;
int parent;
int lchild;
int rchild;
};
void Huffman (char ch[MAX],int weit[MAX],int NUM)
{
int TNUM,LTH;
TNUM=NUM*2-1;//整个哈夫曼树节点的个数
LTH=NUM-1;//编码的最大长度
Node nodes[MAX]; //用对象数组存储哈夫曼树
int one,two,a,b;
int hc[MAX][MAX]; //用于存储编码
int m,n;
//初始化数组
for(i=0;i<NUM;i++)
{
nodes[i].data=ch[i];
nodes[i].weight=weit[i];
nodes[i].parent=-1;
nodes[i].lchild=-1;
nodes[i].rchild=-1;
}
for(i=NUM;i<TNUM;i++)
{
nodes[i].data='@';
nodes[i].weight=-1;
nodes[i].parent=-1;
nodes[i].lchild=-1;
nodes[i].rchild=-1;
}

//建立哈夫曼树
for(i=NUM;i<TNUM;i++)
{
a=b=-1;
one=two=100000; //最大权数
for(j=0;j<i;j++)
{
if(nodes[j].parent==-1)
{
if(nodes[j].weight<=two)
{
one=two;
two=nodes[j].weight;
a=b;
b=j;
}
else if(nodes[j].weight>two&&nodes[j].weight<=one)
{
one=nodes[j].weight;
a=j;
}
}
}//for语句得到 parent=-1(即尚没有父结点)且weight最小的两个结点
nodes[a].parent=i;
nodes[b].parent=i;
nodes[i].lchild=a;
nodes[i].rchild=b;
nodes[i].weight=nodes[a].weight+nodes[b].weight;
}

//初始化hc
for(i=0;i<LTH;i++)
{
for(j=0;j<NUM;j++)
{
hc[j][i]=7;
}
}

//编码
for(i=0;i<NUM;i++)
{
j=LTH-1;
for(m=i,n=nodes[i].parent;m!=-1;m=n,n=nodes[n].parent)
{
if(nodes[n].lchild==m)
{
hc[i][j]=0;
}
else
{
hc[i][j]=1;
}
j--;
}
}


//输出编码
cout<<"Result:"<<endl;
cout<<setw(6)<<"char"<<setw(10)<<"frequency"<<setw(16)<<"huffmancode\n";
for(i=0;i<NUM;i++)
{
cout<<setw(6)<<ch[i]<<setw(8)<<weit[i];
cout<<" ";
for(j=0;j<LTH;j++)
{
if(hc[i][j]!=7)
{
cout<<hc[i][j];
}
}
cout<<endl;
}
cout<<"Done."<<endl;
}
/*********************************************************************/
void main()
{
char key='y';
char a[MAX];//用来存放输入的字符串
char ch[MAX];//用来存放所输入字符串中不重复的字符的数组
int weit[MAX];//用来存放对应于ch数组个每个字符权值的数组(ps:ch数组和weit数组是一一对应的关系)
int length;//计算输入字符串的长度
int NUM=0;//不同字母的个数
while(key=='y'||key=='Y')
{
cout<<"请输入您要进行Huffman编码的字符串:"<<endl;
cin>>a;
length=strlen(a);
//将输入的字符串进行处理,把完全不相同的字符放入ch数组中
bool x;
for(i=0;i<length;i++)
{
x=true;
for(int g=0;g<MAX;g++)
if(ch[g]==a[i])
{
x=false;
break;
}
if(x)
{
ch[NUM]=a[i];
NUM++;
}
}
//计算出ch数组中字符出现的频率(即权值)
for(i=0;i<NUM;i++)
{
int dota=0;
for(j=0;j<length;j++)
{
if(ch[i]==a[j])
dota++;
}
weit[i]=dota;
}
Huffman(ch,weit,NUM);
cout<<"是否继续进行Huffman编码 Y(继续)or N(退出)"<<endl;
cin>>key;
}
}

麻烦大家帮忙看下代码,可以运行,但是当一输入字符串就发生错误,谁能耐心的看一下,感激涕零。。
...全文

相关推荐

多元Huffman编码问题(贪心算法)

题目:在一个操场的四周摆放着n堆石子。现要将石子有次序的合并成一堆。规定每次至少选2堆最多选k堆石子合并成新的一堆,合并的费用为新的一堆的石子数。试设计一个算法,计算出将n堆石子合并成一堆的最大费用和最小费用。 可以直接运行。

chris11

Huffman树编码问题

关于Huffman树的编码问题,适合基础薄弱的学生转载

appledx520

多元Huffman编码问题[源码]

本文探讨了多元Huffman编码问题,特别是在石子合并场景中的应用。文章详细分析了如何计算将n堆石子合并成一堆的最大总费用和最小总费用。最大费用通过从大到小两两合并实现,而最小费用则需要尽可能以k堆为一组进行合并,并在必要时通过补零来满足合并条件。文中提供了具体的算法实现和代码示例,包括快速排序、二分查找插入等辅助函数,以及处理补零情况的逻辑。通过测试用例验证了算法的正确性,展示了如何在实际问题中应用Huffman编码原理。

rice5

图像处理中的压缩编码问题用Huffman

图像处理压缩编码是研究的一个热点目前有很多压缩方法,其中Huffman树压缩

liuyuanxxxxx

南邮 OJ 1267 多元Huffman编码问题

多元Huffman编码问题 时间限制(普通/Java) : 1000 MS/ 3000 MS          运行内存限制 : 65536 KByte 总提交 : 93            测试通过 : 14  比赛描述 在一个操场的四周摆放着n 堆石子。现要将石子有次序地合并成一堆。规定每次至少选2 堆最多选k堆石子合并成新的一堆,合并的费用为新的一堆的石子数。试设计一个算法,计

chenrujun2010
评论 3
收藏 已收藏
分享
返回顶部
fantasyfans
C++ 语言 65,214 成员 250,514 内容