中南大学计算机体系结构实验报告材料.docx
- 文档编号:1014061
- 上传时间:2022-10-15
- 格式:DOCX
- 页数:25
- 大小:418.76KB
中南大学计算机体系结构实验报告材料.docx
《中南大学计算机体系结构实验报告材料.docx》由会员分享,可在线阅读,更多相关《中南大学计算机体系结构实验报告材料.docx(25页珍藏版)》请在冰豆网上搜索。
中南大学计算机体系结构实验报告材料
计算机体系结构
实验报告
学院:
信息科学与工程学院
专业班级:
高赛文的小仙女
指导老师:
雷向东
姓名:
igot7
实验1对指令操作码进行霍夫曼编码
一、实验目的
1.了解和掌握指令编码的基本要求和基本原理
二、实验内容
1.使用编程工具编写一个程序,对一组指令进行霍夫曼编码,并输出最后的编码结果以及对
指令码的长度进行评价。
与扩展操作码和等长编码进行比较。
问题描述以及问题分析:
我们举例说明此问题,例如:
有一组指令的操作码共分七类,它们出现概率如
下表所示:
P1P2P3P4P5P6P7
0.450.300.150.050.030.010.01
对此组指令进行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树进行中序遍历即可完成编码工作。
三、实验过程
观察上图1,不难看出构造HUFFMAN树所要做的工作:
1、先对各指令操作码的出现概率进行排序,构造一个有序链表。
2、再取出两个最小的概率节点相加,生成一个生的节点加入到链表中,同时从两表中删除此两个节点。
3、在对链表进行排序,链表是否只有一个节点,是则HUFFAN树构造完毕,否则继续做2的操作。
为此设计一个工作链表(链表的元素时类,此类的功能相当结构。
)、HUFFMAN树节点、HUFFMAN编码表节点。
具体如下:
//huff_mantreepoint;
classhuff_p{
public:
huff_p*r_child;//大概率的节点,即右子节点;
huff_p*l_child;//小概率的节点,即左子节点;
charop_mask[3];//指令标号;
floatp;//指令使用概率;
};
//worklinkpoint
classf_min_p{
public:
f_min_p*next;
charop_mask[3];//指令标号;
floatp;//指令使用概率;
huff_p*huf_p;
};
/huff_mancodepoint
classhuff_code{
public:
huff_code*next;
floatp;
charop_mask[3];
charcode[N];//huffman编码;
};
函数说明:
f_min_p*input_instruct_set();//输入指令集子模块;
huff_p*creat_huffman_tree(f_min_p*head);//构造huffman树;
f_min_p*fin_min(f_min_p*h);//在工作链表中寻找最小概率节点函数。
f_min_p*del_min(f_min_p*h,f_min_p*p);//在工作链表中删除最小概率节点函数。
voidinsert_n(f_min_p*h,f_min_p*p);//在工作链表中插入两个最小概率节点生成的节点函数。
huff_p*creat_huffp(f_min_p*p);//生成HUFFMAN节点。
voidcreat_huffman_code(huff_p*h1,huff_code*h);//生成huffman编码;
voidr_find(huff_p*p1,charcode[],inti,huff_code*h);
//遍历HUFFMAN树生成指令操作码的HUFFMAN编码。
voidoutput_huffman(huff_code*head);//输出huffman编码;
voidcal_sort_length(huff_code*head);//计算指令用huffman编码的平均编码字长
程序清单及注释:
#include
#include
#defineN8
//findtwominprogram;
//huff_mantreepont;
classhuff_p{
public:
huff_p*r_child;//大概率的节点;
huff_p*l_child;//小概率的节点;
charop_mask[3];//指令标号;
floatp;//指令使用概率;
};
classf_min_p{
public:
f_min_p*next;
charop_mask[3];//指令标号;
floatp;//指令使用概率;
huff_p*huf_p;
};
//huff_mancode
classhuff_code{
public:
huff_code*next;
floatp;
charop_mask[3];
charcode[N];//huffman编码;
};
f_min_p*input_instruct_set();//输入指令集子模块;
huff_p*creat_huffman_tree(f_min_p*head);//构造huffman树;
f_min_p*fin_min(f_min_p*h);
f_min_p*del_min(f_min_p*h,f_min_p*p);
voidinsert_n(f_min_p*h,f_min_p*p);
huff_p*creat_huffp(f_min_p*p);
voidcreat_huffman_code(huff_p*h1,huff_code*h);//生成huffman编码;
voidr_find(huff_p*p1,charcode[],inti,huff_code*h);
voidoutput_huffman(huff_code*head);//输出huffman编码;
voidcal_sort_length(huff_code*head);//计算指令用huffman编码的平均编码字长
voidmain()
{
f_min_p*h,*h1;
huff_p*root;
huff_code*head,*pl;
int
h=input_instruct_set();
/*
p1=h;
while(p1)
{
cout<
p1=p1->next;
}
*/
h1=h;
root=creat_huffman_tree(h1);
head=newhuff_code;
head->next=NULL;
creat_huffman_code(root,head);
output_huffman(head);
cal_sort_length(head);
pl=head->next;
while(pl)
{
deletehead;
head=pl;
pl=pl->next;
}
}
f_min_p*input_instruct_set()
{
f_min_p*head;
f_min_p*h;
h=newf_min_p;
h->next=NULL;
h->huf_p=NULL;
head=h;
intn;
cout<<"请输入指令数:
";
cin>>n;
cout<<"请输入指令标号:
";
cin>>h->op_mask;
cout<<"请输入指令的使用概率:
";
cin>>h->p;
int
f_min_p*point;
f_min_p*p1=head;
for(;i { point=newf_min_p; cout<<"请输入指令标号: "; cin>>point->op_mask; point->op_mask[2]='\0'; cout<<"请输入指令的使用概率: "; cin>>point->p; point->huf_p=NULL; point->next=p1->next; p1->next=point; p1=point; } returnhead; } huff_p*creat_huffman_tree(f_min_p*h) { f_min_p*h1,*min1,*min2,*comb; huff_p*head,*rd,*ld,*parent; h1=h; min1=fin_min(h1); ld=creat_huffp(min1); h1=del_min(h1,min1); if(h1->next) min2=fin_min(h1); else min2=h1; rd=creat_huffp(min2); comb=newf_min_p; comb->next=NULL; comb->p=rd->p+ld->p; comb->op_mask[0]='\0'; comb->op_mask[1]='\0'; parent=creat_huffp(comb); insert_n(h1,comb); if(h1->next! =NULL) h1=del_min(h1,min2); parent->l_child=ld; parent->r_child=rd; comb->huf_p=parent; head=parent; inti=0; cout< while(h1->next! =NULL) { min1=fin_min(h1); if(min1->huf_p==NULL) { ld=creat_huffp(min1); } else { ld=min1->huf_p; } h1=del_min(h1,min1); if(h1->next) min2=fin_min(h1); else min2=h1; if(min2->huf_p==NULL) { } rd=creat_huffp(min2); rd=min2->huf_p; comb=newf_min_p; comb->next=NULL; comb->p=rd->p+ld->p; comb->op_mask[0]='\0'; comb->op_mask[1]='\0'; parent=creat_huffp(comb); if(h1! =NULL) insert_n(h1,comb); if(h1->next! =NULL) h1=del_min(h1,min2); parent->l_child=ld; parent->r_child=rd; comb->huf_p=parent; head=parent; cout<<++i< if(h1->next==NULL)break; } dele
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 中南 大学计算机 体系结构 实验 报告 材料