




已阅读5页,还剩3页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
算法分析与设计课程设计报告题 目:利用哈夫曼编码算法实现字串最优前缀码的生成工作 专 业: 计算机科学与技术 班 级: 姓 名: 指导教师: 2016年 5 月 25日一、问题分析。哈夫曼编码是广泛地用于数据文件压缩的十分有效的编码方法。 哈夫曼树注意事项: 初始森林中的n棵二叉树,每棵树有一个孤立的结点,它们既是根,又是叶子 n个叶子的哈夫曼树要经过n-1次合并,产生n-1个新结点。最终求得的哈夫曼树中共有2n-1个结点。 哈夫曼树是严格的二叉树,没有度数为1的分支结点。前缀码:对每一个字符规定一个0,1串作为其代码,并要求任一字符的代码都不是其他字符代码的前缀。这种编码称为前缀码。表示最优前缀码的二叉树总是一棵完全二叉树,即树中任意节点都有2个儿子。带权值的结点都是叶子结点。权值越小的结点,其到根结点的路径越长。所谓前缀码是指,对字符集进行编码时,要求字符集中任一字符的编码都不是其它字符的编码的前缀,比如常见的等长编码就是前缀码。所谓最优前缀码是指,平均码长或文件总长最小的前缀编码称为最优的前缀码(这里的平均码长相当于码长的期望值)。哈夫曼编码算法实现字串最优前缀码的生成,这是压缩的一种方式,在实际生活中应用广泛,一般采用贪心算法,二、问题的解决方案/算法选择/设计思路。(1)哈夫曼算法以自底向上的方式构造表示最优前缀码的二叉树T。 (2)算法以|C|个叶结点开始,执行|C|1次的“合并”运算后产生最终所要求的树T。 (3)假设编码字符集中每一字符c的频率是f(c)。以f为键值的优先队列Q用在贪心选择时有效地确定算法当前要合并的2棵具有最小频率的树。一旦2棵具有最小频率的树合并后,产生一棵新的树,其频率为合并的2棵树的频率之和,并将新树插入优先队列Q。经过n1次的合并后,优先队列中只剩下一棵树,即所要求的树T。生成哈夫曼树(1)根据给定的n个权值w1,w2,.,wn构造n棵二叉树的集合F=T1,T2,.,Tn,其中Ti中只有一个权值为wi的根结点,左右子树为空; (2)在F中选取两棵根结点的权值为最小的数作为左、右子树以构造一棵新的二叉树,且置新的二叉树的根结点的权值为左、右子树上根结点的权值之和。 (3)将新的二叉树加入到F中,删除原两棵根结点权值最小的树;(4)重复(2)和(3)直到F中只含一棵树为止,这棵树就是哈夫曼树。图1在队列中取最小的两个数,根的权值是这两个数的和,在将根的值带回队列中,在取最小的两个数,重复进行,得到哈夫曼树。记左子树为0,右子树为1,得到最优前缀数。三、算法设计/问题求解中所遇到的问题及分析解决方案。 生成树/*功能用于生成哈夫曼树*/ huffman ctrHuffmanTree(int n) int m=2*n-1;/1n存储叶子结点n+1m存储树的n-1个内部结点 huffman tree=(huffman)malloc(sizeof(huffmanNode)*(m+1);/用于存储哈夫曼树各结点 priorityqueue h;/用于存储优先队列首地址 int i; if(tree=NULL) printf(out of space); exit(-1); /*生成叶子结点*/ for(i=1;i=n;i+) printf(输入 %d 字母和权重:,i); scanf(%c%f,&treei.c,&treei.f); treei.i=i; treei.parent=treei.lchild=treei.rchild=-1; treei.code=NULL; getchar();/吸收回车 /*初始化优先队列*/ h=initializePrioQueue(n,tree); /*生成n-1个内部结点*/ for(i=n+1;i=m;i+) huffmanNode x,y,z; x=popPrioQueue(h); y=popPrioQueue(h); z.f=x.f+y.f; z.lchild=x.i; z.rchild=y.i; z.parent=-1; z.i=i; treex.i.parent=i; treey.i.parent=i; treei=z; pushPrioQueue(h,z); /*前缀码生成*/ for(i=1;ielement); free(h); return tree; 四、算法设计/问题求解特色及关键技术。 特点:随机生成权重。 贪心算法:二叉树T表示字符集C的一个最优前缀码,证明可以对T作适当修改后得到一棵新的二叉树T”,在T”中x和y是最深叶子且为兄弟,同时T”表示的前缀码也是C的最优前缀码。设b和c是二叉树T的最深叶子,且为兄弟。设f(b)=f(c),f(x)=f(y)。由于x和y是C中具有最小频率的两个字符,有f(x)=f(b),f(y)size;h-elementi/2.fx.f;i/=2) h-elementi=h-elementi/2;/父结点向下移 h-elementi=x; 五、算法测试。图3六、结论。根据各个字符的权值建立一颗哈夫曼树制作哈夫曼编码表,对数据文件的编码过程是:依次读人文件中的字符,在哈夫曼编码表中找到此字符,将字符转换为对应的哈夫曼编码。对压缩后的数据文件进行解码则必须借助于哈夫曼树,其过程是:依次读人文件的二进制码,从哈夫曼树的根结点出发,若当前读入0,则走向左孩子,否则走向右孩子。一旦到达某一叶子时便译出相应的字符。然后重新从根出发继续译码,直至文件结束。哈夫曼编码是动态变长编码,临时建立概率统计表和编码树。概率小的码比较长,概率小的码比较长。概率大的码短,这样把一篇文件编码后,就会压缩许多。从树的角度看,哈夫曼编码方式是尽量把短码都利用上。首先,把一阶节点全都用上,如果码字不够时,然后,再从某个节点伸出若干枝,引出二阶节点作为码字,以此类推,显然所得码长最短,再根据建立的概率统计表合理分布和放置,使其平均码长最短就可以得到最佳码。该代码缺少可视化,缺乏实用性,不具有成为优秀代码的资格。但该代码的构思独特,思路清晰,具有简约明了等特征,颇具使用性。用取局部最优的贪心算法,更简单的将问题清晰化,更好的解决问题。通过这次设计,我对二叉树和哈夫曼树有
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 仓储设施规划管理制度
- 乡镇机关资产管理制度
- 食品厂诚信经营管理制度
- 自建办公楼资金管理制度
- 临时用工安全管理制度
- 企业交纳党费管理制度
- 代管资金专户管理制度
- pdca专案管理制度
- 企业办公大堂管理制度
- 仪器药品消耗管理制度
- 印度尼西亚劳动法
- 工业机器人的发展现状和未来趋势
- 安宁疗护疼痛管理指南的系统评价
- (完整版)语文作文纸方格纸模版(两种格式任选)
- 建函201521号 广铁集团建管处关于发布《邻近营业线施工物理隔离防护办法》的通知
- 健康管理师-第十六章-健康管理相关法律法规
- 审计学-中央财经大学中国大学mooc课后章节答案期末考试题库2023年
- 肾内科学篇病例分析1
- 2023年高考英语二模试题分项汇编-09翻译(教师版)(上海)
- GB/T 42596.3-2023机床安全压力机第3部分:液压机安全要求
- 黑龙江省教育科学规划课题成果鉴定与结题验收评价表
评论
0/150
提交评论