会哈夫曼编码的大虾请帮帮忙啊!

michel138 2008-12-16 10:04:26
各位大虾大家好,小生最近遇到一大难题,就是要求用C++编一个信源编码译码程序,具体要求是:输入一串字符比如ABCDSFSAFDS,那么编码后能输出各字符的编码和整串字符串的编码还有译码输出。就是这个问题了,请各位大虾能帮助小弟解决这个问题,谢谢各位了~~~
...全文
94 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
michel138 2008-12-18
  • 打赏
  • 举报
回复
谢谢哥哥的帮忙,但是好像不是我要的,而且还有错误,不过还是十分感谢这位大虾,继续跪求.....
jojotom 2008-12-16
  • 打赏
  • 举报
回复
只是部分代码了
jojotom 2008-12-16
  • 打赏
  • 举报
回复
//从键盘输入建立哈夫曼树,并写入文件hfmtree.dat
//******************************************************
void HuffmanTree::createhuffmantreefromkeyboard() {
int num;
cout<<"\n请输入源码字符集的个数:";
cin>>num;
if (num<=1) {
cout<<"无法建立少于2个叶子结点的哈夫曼树\n";
return;
}
leafnum=num;
node=new HuffmanTreenode[2*num-1];
info=new char[num];
for (int i=0;i<num;i++) {
cout<<"请输入第"<<i+1<<"个字符值";
getchar(); //cin>>info[i]不能读入空格
info[i]=getchar();
getchar();
cout<<"请输入该字符的权值或频度";
cin>>node[i].weight;
}
for (int i=num;i<2*num-1;i++) { //循环建立哈夫曼树内部结点
int pos1=-1,pos2=-1;
int min=32767,max=32767;

for (int j=0;j<i;j++) { //在所有子树的根结点中,选权重最小的两个根结点
if (node[j].parent==-1) {
if (node[j].weight<min) {
max=min;
min=node[j].weight;
pos2=pos1;
pos1=j;
}
else if (node[j].weight<max) {
max=node[j].weight;
pos2=j;
}
}
}
node[i].weight=node[pos1].weight+node[pos2].weight;//在下标i处新构造一个哈夫曼树的内部结点,其左、右孩子就是以上pos1、pos2所指向的结点
node[i].lchild=pos1;
node[i].rchild=pos2;
node[i].parent=-1;
node[pos1].parent=node[pos2].parent=i;
}
cout<<"哈夫曼树已成功构造完成"<<endl;
char choice;
cout<<"是否要替换已有的哈夫曼树文件(y/n)"<<endl; //把建立好的哈夫曼树写入文件hfmTree.dat
cout<<"请选择:";
cin>>choice;
if (choice=='n') return;
ofstream outfile;
outfile.open("hfmtree.dat",ios::out|ios::binary|ios::trunc);
/*
if (outfile.fail()) {
cout<<"哈夫曼树文件打开失败,无法将哈夫曼树写入hfmtree。dat文件"<<endl;
return;
}
*/
outfile.write((char *)&num,sizeof(num));
for (int i=0;i<num;i++) {
outfile.write((char *)&info[i],sizeof(info[i]));
flush(cout);
}
for (int i=0;i<2*num-1;i++) {
outfile.write((char *)&node[i],sizeof(node[i]));
flush(cout);
}
outfile.close();
cout<<"\n哈夫树已成功写入hfmtree。dat文件\n";
}

//使用建立好的哈夫曼树对文件tobetran.txt中的正文进行编码,并将码文写入文件codefile.dat中
//******************************************************
void HuffmanTree::encoder() {
if (node==NULL) {
createhuffmantreefromfile();
if (leafnum<=1) {
cout<<"内存无哈夫曼树。操作撤销。\n\n";
return;
}
}

char *sourcetext; //字符串数组,用于存放源文
char choice;
cout<<"从文件中读入源文(按1),从键盘输入源文(按2)"<<endl;
cout<<"请选择:";
cin>>choice;
if (choice=='1') {
ifstream file1;
file1.open("tobetran.txt",ios::in);
if (file1.fail()) {
cout<<"源文件打开失败!"<<endl;
return;
}
char ch;
int k=0;
while (file1.get(ch)) k++;//第一次读文件只统计文件中有多少个字符,将字符数存入k
file1.close();
sourcetext=new char[k+1]; //最后一个char空间存放字符串结束符
ifstream file2;
file2.open("tobetran.txt",ios::in);
k=0; //重置为0
while (file2.get(ch)) sourcetext[k++]=ch; //k++为后加
sourcetext[k]='\0';
cout<<"源文件为:"<<sourcetext<<endl;
file2.close();
}
else {
string s;
cout<<"请输入需要编码的源文(任意长度):"<<endl;
cin>>s;
int k=s.size ();
sourcetext=new char[k+1];

for (int i=0;i<k;i++) sourcetext[i]=s[i];
sourcetext[k]='\0';
}
//开始编码
ofstream fop("codefile.dat",ios::trunc);
char *code=new char[leafnum]; //存放一个源文字符的编码
int k=0;

while (sourcetext[k]!='\0') {
int i,j,x=0;
for (i=0;i<leafnum;i++) { //通过源文字符集info[]找到当前要编码的源文的字符在哈夫曼树node[]中的下标
if (sourcetext[k]==info[i]) break;
if (i>=leafnum-1) {
cout<<"源码中出现不能编码的字符"<<endl;
return;
}
}
j=i;
while (node[j].parent!=-1) { //从叶结点开始往根结点走,每往上走一层,就产生一位编码存入code[]
if (node[node[j].parent].lchild==i) code[x++]='0';
else code[x++]='1';
i=j=node[j].parent;
}
code[x]='\0'; //置串结束符
for (i=0;i<x/2;i++) { //由于code[]中的编码是叶子到根的路径编码,需要逆置成从根到叶结点的路径编码
choice=code[i];
code[i]=code[x-1-i];
code[x-1-i]=choice;
}
//将源文的当前字符的对应编码写入码文文件
i=0;
while (code[i]!='\0') {
fop<<code[i];
//cout<<code[i];
i++;
}
k++;
}
fop.close();
cout<<"\n已完成编码,码文已写入文件codefile.dat中。\n";
}
内容概要:本文针对考虑算力负荷时空迁移特性的多微电网与共享储能系统的协同优化调度问题展开研究,并提供了完整的Matlab代码实现。研究构建了融合算力负荷动态迁移特征的数学优化模型,通过引入共享储能机制,实现多微电网间的能量互济与资源协同,有效提升系统对分布式能源波动性和负荷不确定性的适应能力。文中采用先进的优化算法求解该调度模型,重点解决了算力任务在时空维度上的灵活调配与电力供需平衡之间的耦合关系,旨在提高综合能源系统的运行经济性、可靠性与灵活性。所提出的方法为未来能源互联网背景下电-算协同管理提供了理论支持与技术路径。; 适合人群:具备电力系统分析、优化理论基础及Matlab编程能力的科研人员、高校研究生,尤其适用于从事微电网运行、共享储能配置、综合能源系统优化以及电-算融合等领域研究的专业技术人员。; 使用场景及目标:①开展多微电网与共享储能系统的协同调度策略设计与仿真验证;②支撑高比例可再生能源接入下的新型电力系统优化运行研究;③为考虑算力迁移的数据中心与电网协同调度提供建模与算法参考;④作为高水平学术论文撰写或学位课题研究的技术支撑与代码复现平台。; 阅读建议:建议读者结合Matlab代码与相关学术文献深入研读,重点关注目标函数构建、约束条件设定及求解器调用逻辑,可在现有模型基础上拓展多时间尺度优化、不确定性建模(如鲁棒优化、随机规划)或加入实际工程约束进行二次开发与深化研究。

65,211

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧