中南大学计算机体系结构实验报告材料文档格式.docx
《中南大学计算机体系结构实验报告材料文档格式.docx》由会员分享,可在线阅读,更多相关《中南大学计算机体系结构实验报告材料文档格式.docx(25页珍藏版)》请在冰豆网上搜索。
有一组指令的操作码共分七类,它们出现概率如
下表所示:
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{
f_min_p*next;
floatp;
huff_p*huf_p;
/huff_mancodepoint
classhuff_code{
huff_code*next;
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<
iostream.h>
math.h>
#defineN8
//findtwominprogram;
//huff_mantreepont;
//大概率的节点;
//小概率的节点;
//huff_mancode
voidmain()
{
f_min_p*h,*h1;
huff_p*root;
huff_code*head,*pl;
int
h=input_instruct_set();
/*
p1=h;
while(p1)
cout<
<
p1->
p<
'
'
;
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->
while(pl)
deletehead;
head=pl;
pl=pl->
f_min_p*input_instruct_set()
f_min_p*head;
f_min_p*h;
h=newf_min_p;
h->
huf_p=NULL;
head=h;
intn;
"
请输入指令数:
cin>
>
n;
请输入指令标号:
op_mask;
请输入指令的使用概率:
p;
f_min_p*point;
f_min_p*p1=head;
for(;
i<
n-1;
i++)
{
point=newf_min_p;
cout<
point->
op_mask[2]='
\0'
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;
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->
p=rd->
p+ld->
op_mask[0]='
op_mask[1]='
parent=creat_huffp(comb);
insert_n(h1,comb);
next!
=NULL)
h1=del_min(h1,min2);
parent->
l_child=ld;
r_child=rd;
huf_p=parent;
head=parent;
inti=0;
endl;
while(h1->
{
if(min1->
huf_p==NULL)
ld=creat_huffp(min1);
}
ld=min1->
huf_p;
min2=fin_min(h1);
min2=h1;
if(min2->
}
rd=creat_huffp(min2);
rd=min2->
comb=newf_min_p;
if(h1!
insert_n(h1,comb);
parent->
head=parent;
++i<
next==NULL)break;
dele