计算机体系结构实验-对指令操作码进行霍夫曼编码
霍夫曼编码设计实验报告

一、实验目的1. 理解霍夫曼编码的基本原理和算法流程。
2. 掌握霍夫曼编码的构建过程和编码方法。
3. 通过实验验证霍夫曼编码在数据压缩方面的效果。
4. 提高编程能力和数据结构应用能力。
二、实验环境1. 操作系统:Windows 102. 编程语言:C++3. 开发工具:Visual Studio 2019三、实验原理霍夫曼编码是一种基于字符出现频率进行编码的数据压缩方法。
其基本原理如下:1. 对字符进行统计,得到每个字符出现的频率。
2. 根据频率对字符进行排序,频率高的字符排在前面。
3. 构建霍夫曼树,将频率高的字符放在树的左侧,频率低的字符放在树的右侧。
4. 从树根到叶子节点,为每个字符分配一个二进制编码,频率高的字符用较短的编码表示,频率低的字符用较长的编码表示。
四、实验步骤1. 定义一个结构体HuffmanNode,用于存储字符及其频率。
2. 实现一个函数用于统计字符频率。
3. 实现一个函数用于构建霍夫曼树。
4. 实现一个函数用于生成霍夫曼编码。
5. 实现一个函数用于解码霍夫曼编码。
6. 编写主函数,进行实验验证。
五、实验过程1. 定义结构体HuffmanNode,用于存储字符及其频率。
```cppstruct HuffmanNode {char ch;int weight;HuffmanNode lchild, rchild;};```2. 实现一个函数用于统计字符频率。
```cppvoid StatFrequency(char str, int freq) {int length = strlen(str);for (int i = 0; i < 256; ++i) {freq[i] = 0;}for (int i = 0; i < length; ++i) {freq[(int)str[i]]++;}}```3. 实现一个函数用于构建霍夫曼树。
```cppHuffmanNode CreateHuffmanTree(int freq, int length) {HuffmanNode nodes = new HuffmanNode[length + 1];for (int i = 0; i < length; ++i) {nodes[i].ch = 'a' + i;nodes[i].weight = freq[i];nodes[i].lchild = nullptr;nodes[i].rchild = nullptr;}for (int i = length; i < length + 1; ++i) {nodes[i].ch = '\0';nodes[i].weight = 0;nodes[i].lchild = nullptr;nodes[i].rchild = nullptr;}for (int i = 0; i < length - 1; ++i) {HuffmanNode minNode1 = &nodes[0];HuffmanNode minNode2 = &nodes[1];for (int j = 0; j < length + 1; ++j) {if (nodes[j].weight < minNode1->weight) {minNode2 = minNode1;minNode1 = &nodes[j];} else if (nodes[j].weight < minNode2->weight && nodes[j].weight > minNode1->weight) {minNode2 = &nodes[j];}}nodes[i].weight = minNode1->weight + minNode2->weight;nodes[i].lchild = minNode1;nodes[i].rchild = minNode2;minNode1->parent = &nodes[i];minNode2->parent = &nodes[i];}return &nodes[length - 1];}```4. 实现一个函数用于生成霍夫曼编码。
数据结构实验实验报告Huffman赫夫曼编码及应用

实验报告课程名称:数据结构实验名称:赫夫曼编码及应用院(系):计算机与通信工程学院专业班级:计算机科学与技术姓名:学号:指导教师:2020 年 5 月12 日一、实验目的掌握赫夫曼树和赫夫曼编码的基本思想和算法的程序实现。
二、实验内容及要求1、任务描述a.提取原始文件中的数据(包括中文、英文或其他字符),根据数据出现的频率为权重,b.构建Huffman编码表;c.根据Huffman编码表对原始文件进行加密,得到加密文件并保存到硬盘上;d.将加密文件进行解密,得到解码文件并保存点硬盘上;e.比对原始文件和解码文件的一致性,得出是否一致的结论。
2、主要数据类型与变量a.对Huffman树采用双亲孩子表示法,便于在加密与解密时的操作。
typedef struct Huffman* HuffmanTree;struct Huffman{unsigned int weight; //权值unsigned int p, l, r;//双亲,左右孩子};b.对文本中出现的所有字符用链表进行存储。
typedef struct statistics* List;struct statistics {char str; //存储此字符int Frequency; //出现的频率(次数)string FinalNum; //Huffman编码struct statistics* Next;};3、算法或程序模块对读取到的文本进行逐字符遍历,统计每个字符出现的次数,并记录在创建的链表中。
借助Huffman树结构,生成结构数组,先存储在文本中出现的所有字符以及它们出现的频率(即权值),当作树的叶子节点。
再根据叶子节点生成它们的双亲节点,同样存入Huffman树中。
在完成对Huffman树的创建与存储之后,根据树节点的双亲节点域以及孩子节点域,生成每个字符的Huffman编码,并存入该字符所在链表节点的FinalNum域。
计算机系统结构课设huffman编码实现

《计算机系统结构教程》课程设计实验报告(课程设计题目:hufferman指令优化)专业 ********************班级********************学号*****学生姓名 ********任课教师 ********2016年4月一、课设目的1)学习简单的文件输入输出程序设计;2)掌握huffman树的构建的方法;3)在指令操作码的优化上huffman编码可以实现操作码编码的优化,用最短的位数来表示指令的操作信息和地址信息。
二、任务要求1) 使用哈夫曼编码来优化指令操作码编码。
2)数据的输入、输出通过文件操作。
3)输出编码、信息熵、平均码长、以及生成的huffman树形三、开发环境操作系统:Windows 10开发工具:Eclipse环境 jdk1.8四、项目原理及算法思想哈夫曼树(Huffman tree),又名最优树,指给定n个权值作为n的叶子结点,构造一棵二叉树,若带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman tree)。
哈夫曼树是带权路径长度最短的树,权值较大的结点离根较近。
若将树中结点赋给一个有着某种含义的数值,则这个数值称为该结点的权。
假设有n个权值,则构造出的哈夫曼树有n个叶子结点。
n个权值分别设为w1、w2、…、wn,则哈夫曼树的构造规则为:(1) 将w1、w2、…,wn看成是有n 棵树的森林(每棵树仅有一个结点);(2) 在森林中选出两个根结点的权值最小的树合并,作为一棵新树的左、右子树,且新树的根结点权值为其左、右子树根结点权值之和;(3)从森林中删除选取的两棵树,并将新树加入森林;(4)重复(2)、(3)步,直到森林中只剩一棵树为止,该树即为所求得的哈夫曼树。
将每个字符的出现频率作为字符结点的权值赋予该结点上,显然字使用频率越小权值越小,权值越小叶子就越靠下,于是频率小编码长,频率高编码短,这样就保证了此树的最小带权路径长度效果上就是传送报文的最短长度。
Huffman编解码实验报告

Huffman编解码实验报告⽂本⽂件的⼆进制预统计Huffman编解码⼀、实验⽬的(1) 熟悉Huffman编解码算法;(2) 理解Huffman编码的最佳性。
⼆、实验内容1、编程思想霍夫曼(Huffman)编码是1952年为⽂本⽂件⽽建⽴,是⼀种统计编码。
属于⽆损压缩编码。
霍夫曼编码的码长是变化的,对于出现频率⾼的信息,编码的长度较短;⽽对于出现频率低的信息,编码长度较长。
这样,处理全部信息的总码长⼀定⼩于实际信息的符号长度。
计算机编程实现时,⾸先统计带编码的⽂本⽂件中各个字符出现的概率,然后将概率作为节点的权值构建huffman树。
编码时从叶⼦节点出发,如果这个节点在左⼦树上,则编码0,否则编码1,直到根节点为⽌,所得到的01序列即为该叶⼦节点的编码。
所有叶⼦节点的编码构成⼀个码本。
有两种译码⽅法:(1)按位读⼊码字,从已建好的Huffman树的根节点开始,若码字为“0”,则跳到左⼦树,若为“1”则跳到右⼦树,直到叶⼦结点为⽌,输出叶⼦接点所表⽰的符号。
(2)由于Huffman编码是唯⼀码,还有另⼀种译码⽅法,每读⼊⼀位编码就去码本中去匹配相应的码字,若匹配不成功,则继续读⼊下⼀个编码,直到匹配成功为⽌。
显然前⼀种⽅法⽐较简便,本程序采⽤便是该⽅法。
2、程序流程图3、编程实现本实验采⽤⽤C 语⾔程序语⾔,VC++ 6.0编程环境。
(1)数据结构构造存放符号及其权值的存储结构如下 typedef struct {unsigned char symbol; //符号的ASCII 码值 int sweight; //权值}syml_weit;syml_weit *sw;构造huffman 树存储结构如下:typedef struct {int weit; //权值int lchd; //左孩⼦地址 int rchd; //右孩⼦地址 int part; //双亲地址 }hufmtree;hufmtree *htree;(2)函数本程序共包含5个函数:⼀个主函数:void main(), 4个⼦函数:void CountWeight(unsigned char *DataBuf,int FileLen); void BuildTree();void HufmCode(unsigned char *DataBuf,int FileLen); void HufmDCode(unsigned char *CDataBuf,int CDataLen); 其功能分别CountWeight----计算⽂本⽂件中各符号的权值; BuildTree-------构建Huffman 树,形成码本; HufmCode---------对⽂本⽂件进⾏编码; HufmDCode-------进⾏译码。
数据结构试验报告霍夫曼编码(DOCX页)

数据结构试验报告霍夫曼编码(DOC X页)数据结构实验报告(三)学院自动化学院学号姓名日期 2014-12-09实验目的1、掌握哈夫曼编码原理;2、熟练掌握哈夫曼树的生成方法;3、理解数据编码压缩和译码输出编码的实现;4、掌握二叉树的基本3操作。
实验内容利用哈夫曼编码进行通信可以大大提高信道利用率,缩短信息传输时间,降低传输成本。
这要求在发送端通过一个编码系统对待传数据预先编码,在接收端将传来的数据进行译码(解码)。
对于双工信道(即可以双向传输信息的信道),每端都需要一个完整的编/译码系统。
试为这样的信息收发站设计一个哈夫曼编/译码系统。
实验要求1) 初始化(Initialzation)。
利用下表给出的字符集和频度的=;实际统计数据建立哈夫曼树,并将它存于文件hfmTree中;字符空格 A B C D E F G H I J K L M 频度 186 64 13 22 32 103 21 1547 57 1 5 32 20 字符 N O P Q R S T U V W X Y Z 频度 57 63 15 1 48 51 80 23 8 18 1 16 12) 编码(EnCoding)。
利用已建好的哈夫曼树(若不在内存中,则从文件hfmTree中读入),对以下报文进行编码,结果存入文件CodeFile中;报文内容:THIS PROGRAM IS MY FAVORITE3) 译码(Decoding)。
利用已建好的哈夫曼树,对文件CodeFile中编码后的报文进行解码,结果存入文件Textfile中;4) 输出(Output)。
输出字符集中每个字符的哈夫曼编码;输出原始报文,及其编码文件CodeFile和解码文件Textfile的内容。
扩展要求:将2)的编码结果以二进制形式存入CodeFile中,输出原始报文长度和编码后的报文长度。
1 需求分析(1) 将实验要求中的表格写在文件“HfmTree.txt”中,程序初始化时从该文件中读取字符及其频度,并据此建立Hfm树,生成编码表,打印出编码表; (2) 编码:用上一步生成的编码表,对报文进行编码,考虑到数据压缩性,这一步将编码结果以二进制文件进行存储,文件名为CodeFile; (3) 解码:从文件CodeFile中读入编码后的报文,利用建立好的Hfm树对其进行一一解码,输出解码结果,同时将结果存入Textfile.txt中; 2 概要设计因本次实验涉及许多字符串的操作,文件读写,并且除了霍夫曼树外,还用到了许多其他数据结构,而本次实验重点在霍夫曼树上,为了省去编写其他数据结构的时间,本次实验选用了C#语言和 .NetFrameWork 4.0来实现。
计算机体系结构实验-对指令操作码进行霍夫曼编码

CENTRAL SOUTH UNIVERSITY计算机体系结构实验报告题目对指令操作码进行霍夫曼编码一、实验目的了解和掌握指令编码的基本要求和基本原理。
二、实验环境Eclipse IDE for Java Developers(Version: Kepler Release)Win7三、实验内容使用编程工具编写一个程序,对一组指令进行霍夫曼编码,并输出最后的编码结果以及对指令码的长度进行评价。
与扩展操作码和等长编码进行比较。
问题描述以及问题分析:我们举例说明此问题,例如:最短编码长度为:H=0.45*1+0.30*2+0.15*3+0.05*4+0.03*5+0.01*6+0.01*6=-1.95.要对指令的操作码进行HUFFMAN编码,只要根据指令的各类操作码的出现概率构造HUFFMAN树再进行HUFFAM编码。
此过程的难点构造HUFFMAN树,进行HUFFAM编码只要对你所生成的HUFFMAN树进行中序遍历即可完成编码工作。
四、关键代码哈夫曼树重点在于如何排列权值大小不同的结点的顺序private int leafNum; //叶子结点个数private HaffmanNode[] hnodes; //哈夫曼树的结点数组public HaffManCode(double[] weight) //构造指定权值集合的哈夫曼树 {int n = weight.length; //n个叶子结点this.leafNum = n;this.hnodes = new HaffmanNode[2*n-1]; //n个叶子结点的哈夫曼树共有2n-1个结点for(int i=0; i<n; i++) //结点数组初始化有n个叶子结点this.hnodes[i] = new HaffmanNode(weight[i]);for(int i=0; i<n-1; i++) //构造n-1个2度结点,每循环一次,构造一个2度结点{double min1, min2;int x1, x2;min1 = min2 = Integer.MAX_VALUE; //选择最小和次最小权值,初值为最大权值x1 = x2 = -1; //记录两个无父母的最小权值结点下标for(int j=0; j<n+i; j++) //查找两个无父母的最小权值结点{if(hnodes[j].weight<min1 && hnodes[j].parent==-1){min2 = min1;x2 = x1;min1 = hnodes[j].weight; //min1记下最小权值x1 = j; //x1记下最小权值结点的下标}else if(hnodes[j].weight<min2 && hnodes[j].parent==-1){min2 = hnodes[j].weight;x2 = j; //x2记下次最小权值结点的下标}}五、运行截图及源代码源代码:package对指令操作码进行霍夫曼编码;class HaffmanNode //哈夫曼树的结点类{double weight; //权值int parent,left,right; //父母结点和左右孩子下标public HaffmanNode(double weight){this.weight = weight;this.parent=-1;this.left=-1;this.right=-1;}public HaffmanNode(){this(0);}public String toString(){return this.weight+" "+this.parent+" "+this.left+" "+this.right; }}public class HaffManCode{private int leafNum; //叶子结点个数private HaffmanNode[] hnodes; //哈夫曼树的结点数组public HaffManCode(double[] weight) //构造指定权值集合的哈夫曼树 {int n = weight.length; //n个叶子结点this.leafNum = n;this.hnodes= new HaffmanNode[2*n-1]; //n个叶子结点的哈夫曼树共有2n-1个结点for(int i=0; i<n; i++) //结点数组初始化有n个叶子结点this.hnodes[i] = new HaffmanNode(weight[i]);for(int i=0; i<n-1; i++) //构造n-1个2度结点,每循环一次,构造一个2度结点{double min1, min2;int x1, x2;min1 = min2 = Integer.MAX_VALUE; //选择最小和次最小权值,初值为最大权值x1 = x2 = -1; //记录两个无父母的最小权值结点下标for(int j=0; j<n+i; j++) //查找两个无父母的最小权值结点 {if(hnodes[j].weight<min1 && hnodes[j].parent==-1){min2 = min1;x2 = x1;min1 = hnodes[j].weight; //min1记下最小权值x1 = j; //x1记下最小权值结点的下标}else if(hnodes[j].weight<min2 && hnodes[j].parent==-1){min2 = hnodes[j].weight;x2 = j; //x2记下次最小权值结点的下标}}hnodes[x1].parent = n+i; //将找出的两棵权值最小的子树合并为一棵子树hnodes[x2].parent = n+i;this.hnodes[n+i] = new HaffmanNode();hnodes[n+i].weight = hnodes[x1].weight+hnodes[x2].weight;hnodes[n+i].left = x1;hnodes[n+i].right = x2;}}public String toString(){String str="";for (int i=0; i<this.hnodes.length && hnodes[i]!=null; i++)str += " "+i+" "+this.hnodes[i].toString()+"\n";return str;}String[] code1 = null;public String[] haffmanCode() //返回当前哈夫曼树的哈夫曼编码 {c ode1 = new String[this.leafNum];S tring[] code = new String[this.leafNum];for(int i=0; i<this.leafNum; i++) //求n个叶子结点的哈夫曼编码{code[i]="";int child = i;int parent = hnodes[child].parent;while (parent!=-1) //由叶结点向上直到根结点循环{if(hnodes[parent].left==child) {code[i]="0"+code[i]; //左孩子结点编码为0code1[i] = code[i];}else {code[i]="1"+code[i]; //右孩子结点编码为1code1[i] = code[i];}child = parent;parent = hnodes[child].parent;}}return code;}public double shortestLong() {i nt lng;d ouble weight, shortestlong = 0;f or(int i=0; i<this.leafNum; i++) {lng = code1[i].length();weight = hnodes[i].weight;shortestlong = shortestlong + lng*weight;}r eturn shortestlong;}public static void main(String[] args){//int[] weight={186, 64, 13, 22, 32, 103, 21, 15, 47, 57, 1, 5, 32, 20}; //指定权值集合d ouble[] weight={0.1, 0.2, 0.1, 0.3, 0.1, 0.2};HaffManCode htree = new HaffManCode(weight);System.out.println("指令权值父指左子右子\n"+htree.toString());String[] code = htree.haffmanCode();System.out.println("哈夫曼编码:");for (int i=0; i<code.length; i++) {System.out.println(code[i]);}System.out.println("最短编码长度为:" + htree.shortestLong());}}。
数据结构实验报告 huffman编码和解码算法

(规格为A4纸或A3纸折叠)佛山科学技术学院(用四号宋体)实验报告(用小二号黑体)课程名称数据结构实验实验项目用Huffman树进行编码和解码算法专业班级姓名学号指导教师成绩日期(用小四号宋体)一、目的和要求1、通过本实验,熟悉二叉树、Huffman树的基本概念,掌握二叉树的存储结构及各种算法。
2、熟悉用Huffman树进行电文的加密与解密算法。
二、实验原理Huffman树是一种特殊的二叉树,其叶结点的编码是一种前缀码,同时,通过统计字符的频度,能够达到编码电文的最小化。
三、实验步骤1、统计电文中字符的出现频率。
2. 用统计频率建立Hffman树。
3.生成前缀码;4.建立huffman树的解码算法.5.用随机输入的电文完成编码与解码过程。
四、源程序#include <stdio.h>#include <stdlib.h>#include <string.h>#define MAX 100struct HTNode{char a;int weight;int parent,lchild,rchild;}*HT; //动态分配数组存储赫夫曼树char **HC;int n=0,m=0;char *write()//存储输入的电文{char *p,*q;printf("请输入电文(结束输入请按enter):\n");p=(char *)malloc(MAX*sizeof(char));//申请存储输入的电文的空间if(!p) exit(0);q=p;scanf("%c",q);while(*q!='\n'){//******录入电文,每录入一个字符同时给电文长度计数器n加一*******//*****************遇到换行符时结束录入***************n=n+1;if(n>=MAX)//判断已申请的空间是否足够录入,不足则追加空间{p=(char *)realloc(q,(MAX+10)*sizeof(char));if(!p) exit(0);}q++;scanf("%c",q);}return(p);}void weight(char *p)//求电文中各字符的概率,并将该概率当作各字符的权值{char *q,*q1,temp;struct HTNode *q2;int i,j,t;q1=q=(char *)malloc(n*sizeof(char));for(;*p!='\n';p++,q1++) *q1=*p;//将电文存放到q1指向的空间中q1=q;for(i=0;i<n-1;i++){//*****对电文中的字符进行排序,使得相同的字符地址连续,方便统计***** t=i;for(j=i+1;j<n;j++)if(*(q1+t)>*(q1+j)) t=j;temp=*(q1+i);*(q1+i)=*(q1+t);*(q1+t)=temp;}temp=*q1;//标记当前为何种字符m=1;for(i=1;i<n;i++)//统计电文中出现过不同的字符的个数{q1++;if(temp!=*q1){m++;//字符种类计数器加一temp=*q1;}}q1=q;HT=(struct HTNode *)malloc(2*m*sizeof(struct HTNode));/*申请赫夫曼树HT的空间,其中0号单元不用*/q2=HT+1;//*****************初始化赫夫曼树HT*********************for(i=1;i<=n;){t=0;for(q2->a=*q1;*q1==q2->a;q1++){t++;i++;}q2->weight=(int)(t*100/n);q2->lchild=0;q2->parent=0;q2->rchild=0;q2++;}for(i=m+1;i<=2*m-1;i++,q2++){q2->lchild=0;q2->parent=0;q2->rchild=0;q2->weight=0;}free(q);}void Select(int t,int *s1,int *s2){/************在HT[1,t]选择parent为0且weight最小的两个结点,其序号分别为s1和s2。
计算机系统结构——课后答案

习题一1、解释下列术语计算机系统的外特性:通常所讲的计算机系统结构的外特性是指机器语言程序员或编译程序编写者所看到的外特性,即由他们所看到的计算机的基本属性(概念性结构和功能特性)。
计算机系统的内特性:计算机系统的设计人员所看到的基本属性,本质上是为了将有关软件人员的基本属性加以逻辑实现的基本属性。
模拟:模拟方法是指用软件方法在一台现有的计算机上实现另一台计算机的指令系统。
可移植性:在新型号机出台后,原来开发的软件仍能继续在升级换代的新型号机器上使用,这就要求软件具有可兼容性,即可移植性。
可兼容性是指一个软件可不经修改或只需少量修改,便可由一台机器移植到另一台机器上运行,即同一软件可应用于不同环境。
Amdahl 定律:系统中对于某一部件采用某种更快的执行方式所能获得的系统性能改进程度,取决于这种执行方式被使用的频度或占总执行时间的比例。
虚拟机(Virtual Machine ):指通过软件模拟的具有完整硬件系统功能的、运行在一个完全隔离环境中的完整计算机系统。
6、7、假定求浮点数平方根的操作在某台机器上的一个基准测试程序中占总执行时间的20%,为了增强该操作的性能,可采用两种不同的方法:一种是增加专门的硬件,可使求浮点数平方根操作的速度提高为原来的20倍;另一种方法是提高所有浮点运算指令的速度,使其为原来的2倍,而浮点运算指令的执行时间在总执行时间中占30%。
试比较这两种方法哪一种更好些。
答:增加硬件的方法的加速比23.120/2.0)2.01(11=+-=p S ,另一种方法的加速比176.12/3.0)3.01(12=+-=p S ,经计算可知Sp1>Sp2第一种方法更好些。
9、假设高速缓存Cache 的工作速度为主存的5倍,且Cache 被访问命中的概率为90%,则采用Cache 能使整个存储系统获得多高的加速比? 答:加速比%10)(%90'⨯++⨯==tc tm tc tmT T S ,其中tm=5tc ,代入公式,得到加速比S=3.33。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
elseif(hnodes[j].weight<min2 &&hnodes[j].parent==-1)
{
min2 =hnodes[j].weight;
x2 = j;//x2记下次最小权值结点的下标
}
}
hnodes[x1].parent= n+i;//将找出的两棵权值最小的子树合并为一棵子树
hnodes[x2].parent= n+i;
publicHaffManCode(double[] weight) //构造指定权值集合的哈夫曼树
{
intn = weight.length; //n个叶子结点
this.leafNum = n;
this.hnodes =newHaffmanNode[2*n-1]; //n个叶子结点的哈夫曼树共有2n-1个结点
for(inti=0; i<n-1; i++)//构造n-1个2度结点,每循环一次,构造一个2度结点
{
doublemin1, min2;
intx1, x2;
min1 = min2 = Integer.MAX_VALUE;//选择最小和次最小权值,初值为最大权值
x1 = x2 = -1;//记录两个无父母的最小权值结点下标
for(inti=0; i<n; i++) //结点数组初始化有n个叶子结点
this.hnodes[i] =newHaffmanNode(weight[i]);
for(inti=0; i<n-1; i++) //构造n-1个2度结点,每循环一次,构造一个2度结点
{
doublemin1, min2;
intx1, x2;
this.leafNum= n;
this.hnodes=newHaffmanNode[2*n-1];//n个叶子结点的哈夫曼树共有2n-1个结点
for(inti=0; i<n; i++)//结点数组初始化有n个叶子结点
this.hnodes[i] =newHaffmanNode(weight[i]);
min1 = min2 = Integer.MAX_VALUE;//选择最小和次最小权值,初值为最大权值
x1 =x2 = -1;//记录两个无父母的最小权值结点下标
for(intj=0; j<n+i; j++)//查找两个无父母的最小权值结点
{
if(hnodes[j].weight<min1 && hnodes[j].parent==-1)
{
String str="";
for(intj=0; j<n+i; j++)//查找两个无父母的最小权值结点
{
if(hnodes[j].weight<min1 &&hnodes[j].parent==-1)
{
min2 = min1;
x2 = x1;
min1 =hnodes[j].weight;//min1记下最小权值
x1 = j;//x1记下最小权值结点的下标
以及对指令码的长度进行评价。与扩展操作码和等长编码进行比较。
问题描述以及问题分析:
我们举例说明此问题,例如:
最短编码长度为:
H=0.45*1+0.30*2+0.15*3+0.05*4+0.03*5+0.01*6+0.01*6=-1.95.
要对指令的操作码进行HUFFMAN编码,只要根据指令的各类操作码的出现概率构造
{
min2 = min1;
x2 = x1;
min1 = hnodes[j].weight; //min1记下最小权值
x1 = j; //x1记下最小权值结点的下标
}
elseif(hnodes[j].weight<min2 && hnodes[j].parent==-1)
{
min2 = hnodes[j].weight;
{
this.weight= weight;
this.parent=-1;
this.left=-1;
this.right=-1;
}
publicHaffmanNode()
{
this(0);
}
publicString toString()
{
returnthis.weight+" "+this.parent+" "+this.left+" "+this.right;
this.hnodes[n+i] =newHaffmanNode();
hnodes[n+i].weight=hnodes[x1].weight+hnodes[x2].weight;
hnodes[n+i].left= x1;
hnodes[n+i].right= x2;
}
}
publicString toString()
HUFFMAN树再进行HUFFAM编码。此过程的难点构造HUFFMAN树,进行HUFFAM编
码只要对你所生成的HUFFMAN树进行中序遍历即可完成编码工作。
四、关键代码
哈夫曼树重点在于如何排列权值大小不同的结点的顺序
privateintleafNum; //叶子结点个数
privateHaffmanNode[] hnodes; //哈夫曼树的结点数组
CENTRAL SOUTH UNIVERSITY
计算机体系结构实验报告
题目对指令操作码进行霍夫曼编码
一、实验目的
了解和掌握指令编码的基本要求和基本原理。
二、实验环境
Eclipse IDE for Java Developers(Version: Kepler Release)
Win7
三、实验内容
使用编程工具编写一个程序,对一组指令进行霍夫曼编码,并输出最后的编码结果
x2 = j; //x2记下次最小权值结点的下标
}
}
五、运行截图及源代码
源代码:
package对指令操作码进行霍夫曼编码;
classHaffmanNode//哈夫曼树的结点类
{
doubleweight;//权值
intparent,left,right;//父母结点和左右孩子下标
publicHaffmanNode(doubleweight)
}
}
publicclassHaffManCode
{
privateintleafNum;//叶子结ቤተ መጻሕፍቲ ባይዱ个数
privateHaffmanNode[]hnodes;//哈夫曼树的结点数组
publicHaffManCode(double[] weight)//构造指定权值集合的哈夫曼树
{
intn = weight.length;//n个叶子结点