中南大学 计算机体系结构实验报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
计算机体系结构课程设计
学院:信息科学与工程学院
专业班级:
指导老师:
学号:
姓名:
目录
实验1 对指令操作码进行霍夫曼编码 (3)
一、实验目的 (3)
二、实验内容 (3)
三、设计思路 (4)
四、关键代码 (4)
五、实验截图 (5)
六、源代码 (5)
实验2 使用LRU 方法更新Cache (8)
一、实验目的 (8)
二、实验内容 (8)
三、设计思路 (9)
四、程序截图 (9)
五、实验代码 (9)
实验总结 (16)
参考文献 (16)
实验1 对指令操作码进行霍夫曼编码一、实验目的
了解和掌握指令编码的基本要求和基本原理
二、实验内容
1. 使用编程工具编写一个程序,对一组指令进行霍夫曼编码,并输出最后的编码结果以及对指令码的长度进行评价。与扩展操作码和等长编码进行比较。
2. 问题描述以及问题分析
举例说明此问题,例如:
下表所示:
对此组指令进行 HUFFMAN 编码正如下图所示:
最后得到的HUFFMAN 编码如下表所示:
最短编码长度为:
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 树进行中序遍历即可完成编码工作。
三、设计思路
观察上图,不难看出构造 HUFFMAN 树所要做的工作:1、先对各指令操作码的出现概率进行排序,构造一个有序链表。2、再取出两个最小的概率节点相加,生成一个生的节点加入到链表中,同时从两表中删除此两个节点。3、在对链表进行排序,链表是否只有一个节点,是则 HUFFAN 树构造完毕,否则继续做 2 的操作。为此设计一个工作链表(链表的元素时类,此类的功能相当结构。)、HUFFMAN 树节点、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 for(int i=0; i min1 = min2 = Integer.MAX_VALUE; //选择最小和次最小权值,初值为最大权值 x1 = x2 = -1; //记录两个无父母的最小权值结点下标 for(int j=0; j if(hnodes[j].weight min2 = min1; x2 = x1; min1 = hnodes[j].weight; //min1记下最小权值 x1 = j; //x1记下最小权值结点的下标 } else if(hnodes[j].weight min2 = hnodes[j].weight; x2 = j; //x2记下次最小权值结点的下标 } } 五、实验截图 六、源代码 public class huffman { private String str; public huffman(String str){ this.str=str; } /** * 创建节点类 * @param args */ class Node{ Node left; Node right; int data; char c; String code=""; } /** * 节点数组(字符串类) * @param args */ public void creatTree(){ //先去掉重复的字符串,若不存在将字符加在strRepeat中 String strRepeat=""; for(int i=0;i char c=str.charAt(i); //判断是否存在 if(strRepeat.indexOf(c)==-1){ //找到字符位置并返回字符所在的位置strRepeat+=c; } } //统计字符出现的次数并建立节点 Node[] nodes=new Node[strRepeat.length()]; //定义了一个nodes数组//存储节点的坐标值 int s=0; for(int i=0;i char c=strRepeat.charAt(i); int count=getCount(str,c); //c在string中出现的次数 Node node=new Node(); node.data=count; node.c=c; nodes[s++]=node; } //创建哈弗曼树 while(nodes.length>1){ sort(nodes); Node node=new Node(); Node n1=nodes[0]; Node n2=nodes[1]; node.data=n1.data+n2.data; node.left=n1; node.right=n2; //改变节点数组长度 Node[] nodes2=new Node[nodes.length-1];