• 题目

赫夫曼编码/译码器

  • 实验目的

本课程设计是为了让同学们了解学习数据结构的作用和意义。数据结构是计算机科学与技术专业的专业基础课,是十分重要的课程。所有的计算机系统软件和应用软件都要用到各种类型的数据结构。因此,想要更好地运用计算机来解决实际问题,仅仅掌握几门计算机程序设计语言是远远难以应付当前众多复杂的课题,想要有效地使用计算机,充分发挥它的性能,还必须学习和掌握好数据结构的有关知识,打好数据结构这门课的扎实基础,对于学习计算机专业其它的课程,如操作系统、软件工程、编译原理、数据库、人工智能等十分有益。

  • 需求分析

(1)初始化(Initialization)。从终端读入字符集大小n,以及n个字符和n个权值,建立赫夫曼树,并将它存于文件hfmTree中。

(2)编码(Encoding)。利用已建好的赫夫曼树(如不在内存,则从文件hfmTree中读入),对文件ToBeTran中的正文进行编码,然后将结果存入文件CodeFile中。

(3)译码(Decoding)。利用已建好的赫夫曼树将文件CodeFile中的代码进行译码,结果存入文件Textfile中。

(4)打印代码文件(Print)。将文件CodeFile以紧凑格式显示在终端上,每行50个代码。同时将此字符形式的编码文件写入文件CodePrin中。

(5)打印赫夫曼树(Tree printing)。将已在内存中的赫夫曼树以直观的方式(比如树)显示在终端上,同时将此字符形式的赫夫曼树写入文件TreePrint 中。

(6)网络通信(Network)。通过赫夫曼编码的形式作为加密方式,进行网络通信。

  • 概要设计

建立赫夫曼树

编码

译码

  • 详细设计

建立赫夫曼树

/*** @param code - 字符集* @param weight - 频数*/public void create(char[] code,double[] weight) {num=code.length;   //获取字符集字符总数node_tot=2*num-1;  //总共需要2num-1个节点PriorityQueue<HTNode> Q = new PriorityQueue<HTNode>();   //优先队列排序HT=new HTNode[node_tot+1];HT[0]=new HTNode(0);//给叶子结点赋值for(int i=1;i<=num;i++) {HT[i]=new HTNode(i,code[i-1],weight[i-1]);Q.add(HT[i]);}int id=num;//Huffman编码while(Q.size()>=2) {//找到两个权值最小的结点作为左右子树的根节点构造新的二叉树。HTNode s1=Q.remove();HTNode s2=Q.remove();id++;//创建新的节点//新节点的权值是两个子节点之和HT[id]=new HTNode(id,s1,s2);     s1.parent=s2.parent=id;        //将两个子节点的父节点设置为 id;//新节点重新放入队列Q.add(HT[id]);}}

建立编码表

/*** 从叶子到根逆向求每个字符的Huffman编码*/public void createHuffmanCode() {int start,c,f;char[] cd=new char[num];HuffmanCodeList=new String[num+1]; //分配内存空间//依次对所有字符编码for(int i=1; i<=num; i++){start=num;//从叶子到根逆向求编码for(c=i,f=HT[i].parent;f!=-1;c=f,f=HT[f].parent) {if(HT[f].lchild==c) {cd[--start]='0';}else{cd[--start]='1';}}//复制编码到Huffman编码表HuffmanCodeList[i]=new String(cd,start,num-start);}}

编码

/*** 从叶子到根逆向求每个字符的Huffman编码*/public void createHuffmanCode() {int start,c,f;char[] cd=new char[num];HuffmanCodeList=new String[num+1]; //分配内存空间//依次对所有字符编码for(int i=1; i<=num; i++){start=num;//从叶子到根逆向求编码for(c=i,f=HT[i].parent;f!=-1;c=f,f=HT[f].parent) {if(HT[f].lchild==c) {cd[--start]='0';}else{cd[--start]='1';}}//复制编码到Huffman编码表HuffmanCodeList[i]=new String(cd,start,num-start);}}

译码

/*** @param code_str - 需要译码的字符串* @return encode - 完成Huffman译码的字符串*/public String deCode(String code_str) {int len=code_str.length();String decode=new String();String temp=new String();//依次与所有字符编码开始匹配for(int i=0;i<len;i++) {temp=temp+code_str.charAt(i);for(int j=1;j<=num;j++) {//匹配成功if(HuffmanCodeList[j].equals(temp)) {decode=decode+HT[j].code;temp="";break;}}if(temp.length()>128)return null;}if(!temp.equals(""))return null;return decode;}

文件分析

FileDialog jf=new FileDialog(this,"选择文本文件",FileDialog.LOAD);jf.setVisible(true);String path=getAllPath(jf);if(path==null) {return;}String str=readFileToString(path);int len=str.length();char[] code = new char[128];double[] weight =new double[128];for(int i=0;i<128;i++) {code[i]=(char)i;}int num=0;for(int i=0;i<len;i++) {char ch=str.charAt(i);if(ch<0||ch>128) {JOptionPane.showMessageDialog(null, "文件读取错误", "错误提示",JOptionPane.ERROR_MESSAGE);return;}if(weight[ch]==0)num++;weight[ch]+=1;}char[] new_code = new char[num];double[] new_weight =new double[num];for(int i=0,j=0;i<128;i++) {if(weight[i]!=0.0) {new_code[j]=code[i];new_weight[j++]=weight[i];}}initHuffmanTree(new_code,new_weight,textArea,textArea_3);

树图绘制

/*** @param root HuffmanTree ROOT* @param g Graphics**/public void paintTree(int root,Graphics g,int x,int y){if(root!=-1){if(HT[root].code=='\0')g.drawString(new Double(HT[root].weight).toString(),x-10,y+10);elseg.drawString(chartoString(HT[root].code)+(new Double(HT[root].weight).toString()),x-10,y+10);if(HT[root].lchild!=-1||HT[root].rchild!=-1){int width=7*HT[root].leaf;g.drawLine(x, y+10, x-width, y+30);paintTree(HT[root].lchild, g,x-width,y+30);g.drawLine(x, y+10, x+width, y+30);paintTree(HT[root].rchild, g,x+width,y+30);}}}  网络通信
/*** @param port 监听端口* @param ta JTextArea对象* @throws IOException 如果发生I / O错误*/public void startReceive(int port,JTextArea ta) throws IOException{// TODO 自动生成的方法存根ssk = new ServerSocket(port);isStop=false;ssk.setSoTimeout(5*1000);new Thread(()-> {while(!isStop) {Socket sk=null;try {sk = ssk.accept();} catch (IOException e) {// TODO 自动生成的 catch 块e.printStackTrace();}new Thread(new ReceiveThread(sk,ta)).start();}try {ssk.close();} catch (IOException e) {// TODO 自动生成的 catch 块e.printStackTrace();}}).start();}
  • 调试分析

GUI布局

使用Windows Builder插件和代码调整的方式进行GUI布局,以达到快速建立GUI和精确布局的目的。

初始化

初始化过程中,会以默认编码形式生成哈夫曼树并生成编码表。

编码控制

采用三种编码产生方式以达到多样性的需求。

树图绘制

递推法实行的树图绘制。

文本编码

即时编码

错误提醒:

网络通信

多线程同步问题

synchronized(ta) {if(destr==null)ta.append("Oh,My God! "+ip+" send a message but it isn\'t Huffman Code!"+"\r\n");elseta.append("Remote Host["+ip+"]:"+destr+"\r\n");}

Synchronized同步以解决多线程问题。

  • 总结

我认为,在这学期的实验中,在收获知识的同时,还收获了阅历,收获了成熟,在此过程中,我们通过查找大量资料,请教老师,以及不懈的努力,不仅培养了独立思考、动手操作的能力,在各种其它能力上也都有了提高。更重要的是,在实验课上,我们学会了很多学习的方法。而这是日后最实用的,真的是受益匪浅。要面对社会的挑战,只有不断的学习、实践,再学习、再实践。

通过设计并编写有关赫夫曼编码与解码,锻炼自己的编程能力,养成良好的编程风格。不管怎样,这些都是一种锻炼,一种知识的积累,能力的提高。完全可以把这个当作基础东西,只有掌握了这些最基础的,才可以更进一步,取得更好的成绩。很少有人会一步登天吧。永不言弃才是最重要的。

《数据结构与算法》课程设计报告——赫夫曼编码/译码器相关推荐

  1. 数据结构c语言程序设计报告,数据结构与算法课程设计报告模版.doc

    数据结构与算法课程设计报告模版.doc 数据结构与算法课程设计报告题 目本科生导师制问题与家族关系查询系统院 (系) 信息科学与工程 专业班级 计算机应用技术1301班 学生姓名 顾 泉 学 号 20 ...

  2. 数据结构计算机专业教学计划编制,数据结构与算法课程设计报告--教学计划编制...

    数据结构与算法课程设计报告--教学计划编制 数据结构与算法课程设计报告题目教学计划编制目录一.需求分析311系统概述3111研究背景3112研究意义及目的312具体分析4121功能需求分析4122运行 ...

  3. 数据结构与算法 课程设计报告——学生信息管理系统

    一.概述 1.开发背景 使用计算机对学生信息进行管理,拥有手工管理所无法比拟的优点.例如:检索迅速.查找方便.可靠性高.存储量大.成本低等.这些优点能够极大地提高学生信息的效率,也是管理科学化.正规化 ...

  4. 数据结构与算法——课程设计报告(全国交通咨询模拟)

    C++ 全国交通咨询模拟 源文件点击此处下载⏬ 1 要求 [问题描述] 全国交通咨询模拟** 处于对不同目的的旅客对交通工具有不同的要求.例如,因公出差的旅客希望在旅途中的时间尽可能短,出门旅游的游客 ...

  5. 数据结构与算法课程设计大作业

    考   核   要  求 课程编号:400802010    课程名称:数据结构与算法课程设计考试形式:大作业 大作业1-9见我的下载 里面包含多个版本的设计 文件有cpp文件设计文档总结等 一.设计 ...

  6. 数据结构与算法课程设计之五子棋(人机)

    数据结构与算法课程设计之五子棋(人机) 五子棋是全国智力运动会竞技项目之一,是一种两人对弈的纯策略型棋类游戏.通常双方分别使用黑白两色的棋子,下在棋盘直线与横线的交叉点上,先形成五子连线者获胜. 这是 ...

  7. 数据结构c语言课程设计报告,(数据结构c语言课程设计报告.doc

    (数据结构c语言课程设计报告 数据结构 课程设计报告 设计题目:迷宫求解 专 业 机电一体化 班 级 08专接本 学 生 学 号 104910252011 指导教师 高在村 完成时间 2011. 5 ...

  8. C语言数据结构迷宫实验报告,数据结构c语言课程设计报告之迷宫

    数据结构c语言课程设计报告之迷宫 C语言与数据结构课程设计报告学 号 ** 姓 名 ** 课程设计题目 迷 宫 求 解 2012 年 5 月目 录1 需求分析 1.1 功能与数据需求 1.1.1 题目 ...

  9. 数据结构与算法课程设计——C语言《职员薪资查询系统》

    数据结构与算法课程设计--C语言<职员薪资查询系统> 温馨提示:课设要自己去操作,自己写代码,可以借鉴他人代码,学习思路和一些操作,切不可完全抄袭!!! 总体说明:设计一个职员薪资查询系统 ...

最新文章

  1. 在redhat6.3 安装oracle 11.2.0.1遇到的错误
  2. 算法与数据结构(part5)--栈与队列
  3. python 图片转文字错误_python3把base64字符串写成图片文件出错
  4. 46 MM配置-采购-条件-定价过程-定义方案组
  5. 学python买什么书-关于 Python 的经典入门书籍有哪些?(python三大经典书)
  6. SQL Server 触发器--备忘
  7. sqlserver 两个数值字段相加_SQLServer 中多行数据合并成一行数据(一个字段)
  8. 将hta包装为exe发布
  9. 高恪新路由三硬盘_新路由3 newifi D2路由器刷机breed高恪固件详细教程
  10. VBA collection函数回传
  11. Java程序崩溃原因分析:错误日志分析及解决(Cannot allocate memory)
  12. 网络编程之(转载自:https://www.cnblogs.com/clschao/articles/9593164.html)
  13. tflearn的VocabularyProcessor用法:建立中文词汇表和把文本转为词ID序列
  14. 程序部署 程序包不放在tomcat里面
  15. 我的世界java局域网存档位置_网易版我的世界局域网联机存档怎么转移 如何将局域网存档转到租赁服...
  16. 基于springboot实现注册功能发送激活码至邮箱激活账户登录
  17. hbase应用场景 java_Hbase Java API 使用
  18. CRC32加密算法原理
  19. 中国知网html阅读说明什么区别,知网研学和中国知网的区别
  20. 使用万用表测试三极管的方法

热门文章

  1. java 中如何实现多进程_在Java中可以使用哪些方法来实现Java的多进程运行模式?...
  2. java eclipse 内存_java – Eclipse 3.5.1使用大量内存
  3. java文件绝对路径_获取文件夹文件绝对路径
  4. python按日期排序_python按修改时间顺序排列文件的实例代码
  5. android builder模式 插件,如何在Kotlin中实现Builder模式?
  6. python基础案例教程_python基础教程 10-11例子如何执行
  7. i219v linux,I219V高传播延迟
  8. System.arraycopy
  9. Java中main函数只能调用同类中的静态方法?
  10. python numpy官网_python+numpy+scipy=matlab,抛弃matlab