北邮信通院数据结构实验报告三哈夫曼编码器.docx

上传人:b****5 文档编号:3082298 上传时间:2022-11-17 格式:DOCX 页数:20 大小:248.99KB
下载 相关 举报
北邮信通院数据结构实验报告三哈夫曼编码器.docx_第1页
第1页 / 共20页
北邮信通院数据结构实验报告三哈夫曼编码器.docx_第2页
第2页 / 共20页
北邮信通院数据结构实验报告三哈夫曼编码器.docx_第3页
第3页 / 共20页
北邮信通院数据结构实验报告三哈夫曼编码器.docx_第4页
第4页 / 共20页
北邮信通院数据结构实验报告三哈夫曼编码器.docx_第5页
第5页 / 共20页
点击查看更多>>
下载资源
资源描述

北邮信通院数据结构实验报告三哈夫曼编码器.docx

《北邮信通院数据结构实验报告三哈夫曼编码器.docx》由会员分享,可在线阅读,更多相关《北邮信通院数据结构实验报告三哈夫曼编码器.docx(20页珍藏版)》请在冰豆网上搜索。

北邮信通院数据结构实验报告三哈夫曼编码器.docx

北邮信通院数据结构实验报告三哈夫曼编码器

数据结构实验报告

实验名称:

 实验三树——哈夫曼编/解码器

学生姓名:

班 级:

班内序号:

 

学 号:

日  期:

 2014年12月11日

1.实验要求

利用二叉树结构实现赫夫曼编/解码器。

基本要求:

1、初始化(Init):

能够对输入得任意长度得字符串s进行统计,统计每个字符得频度,并建立赫夫曼树

2、建立编码表(CreateTable):

利用已经建好得赫夫曼树进行编码,并将每个字符得编码输出。

3、编码(Encoding):

根据编码表对输入得字符串进行编码,并将编码后得字符串输出。

4、译码(Decoding):

利用已经建好得赫夫曼树对编码后得字符串进行译码,并输出译码结果。

5、打印(Print):

以直观得方式打印赫夫曼树(选作)

6、计算输入得字符串编码前与编码后得长度,并进行分析,讨论赫夫曼编码得压缩效果。

测试数据:

 Ilove data Structure,Iloveputer。

I will trymybest tostudydataStructure、

提示:

1、用户界面可以设计为“菜单”方式:

能够进行交互。

 2、根据输入得字符串中每个字符出现得次数统计频度,对没有出现得

ﻩ字符一律不用编码。

2、程序分析

2、1 存储结构

Huffman树

给定一组具有确定权值得叶子结点,可以构造出不同得二叉树,其中带权路径长度最小得二叉树称为Huffman树,也叫做最优二叉树。

weight  lchildrchild  parent

-1

-1

-1

5

-1

-1

-1

6

-1

-1

-1

7

-1

-1

-1

-1

-1

-1

weight lchild rchild parent

2

-1

-1

5

5

-1

-1

5

6

-1

-1

6

7

-1

-1

6

9

-1

-1

7

7

0

1

7

13

3

8

16

5

4

8

29

6

7

-1

2、2关键算法分析

(1)计算出现字符得权值

利用ASCII码统计出现字符得次数,再将未出现得字符进行筛选,将出现得字符及頻数存储在数组a[]中。

 voidHuffman:

:

Init()

{

ﻩintnNum[256]={0};       //记录每一个字符出现得次数

intch=cin、get();  

int i=0;

ﻩwhile((ch!

='\r')&&(ch!

='\n'))

ﻩ{

ﻩﻩnNum[ch]++;          //统计字符出现得次数

ﻩstr[i++]=ch;        //记录原始字符串

ﻩch= cin、get();     //读取下一个字符

ﻩ}

str[i]='\0';

n= 0;

 for( i=0;i<256;i++)

ﻩ{

ﻩﻩif (nNum[i]>0)     //若nNum[i]==0,字符未出现

ﻩ{

l[n] =(char)i;   

ﻩa[n]= nNum[i]; 

n++;

ﻩ}

}

}

时间复杂度为O(1);

(2)创建哈夫曼树:

算法过程:

Huffman树采用顺序存储---数组;

数组得前n个结点存储叶子结点,然后就是分支结点,最后就是根结点;

首先初始化叶子结点元素—循环实现;

以循环结构,实现分支结点得合成,合成规则按照huffman树构成规则进行。

关键点:

选择最小与次小结点合成。

void Huffman:

:

CreateHTree()

{

ﻩHTree =newHNode[2*n-1]; //根据权重数组a[0、、n-1]初始化Huffman树

for(intj =0; j<n;j++) 

{

ﻩHTree[j]、weight=a[j];

ﻩﻩHTree[j]、LChild=HTree[j]、RChild=HTree[j]、parent =-1;

ﻩ}

  intx,y;

 for(inti= n;i<2*n-1;i++) //开始建Huffman树

{ 

SelectMin( HTree, i,x,y); ﻩ//从1~i中选出两个权值最小得结点

HTree[x]、parent=HTree[y]、parent=i;

ﻩHTree[i]、weight=HTree[x]、weight+HTree[y]、weight;

HTree[i]、LChild =x;

HTree[i]、RChild=y;

ﻩﻩHTree[i]、parent=-1;

ﻩ}

}

时间复杂度为O(n2)

void Huffman:

:

SelectMin(HNode*hTree,intn, int &i1,int&i2)

{

 inti;

//找一个比较值得起始值

for(i=0; i

{ if(hTree[i]、parent==-1)

 {  i1=i;break;  }

}

 i++;

 for( ;i<n;i++)//找i2

 {  if(hTree[i]、parent==-1)

 {  i2=i; break; }

  }

 if(hTree[i1]、weight>hTree[i2]、weight)//i1指向最小得

{ intj=i2;   i2=i1;  i1=j;  }

  //开始找最小得两个

i++;

for( ; i<n;i++)

  { if(hTree[i]、parent==-1 

   &&hTree[i]、weight 

  { i2=i1;    i1 =i;  }

  elseif(hTree[i]、parent==-1

   &&hTree[i]、weight<hTree[i2]、weight)

 {i2=i;}

时间复杂度为O(n)

(3)创建编码表

算法过程:

从叶子到根---自底向上

首先定义码表存储空间; 

循环对n个叶子结点自底向上回溯到根,记下途径得左右关系,形成编码得逆序串;

将各个叶子结点对应得逆序串反序即可。

 

voidHuffman:

:

CreateCodeTable()

{

 ﻩHCodeTable=newHCode[n];//生成编码表

ﻩfor(inti=0;i

{

ﻩHCodeTable[i]、data=l[i]; 

   ﻩintchild =i;ﻩ//孩子结点编号

 ﻩintparent = HTree[i]、parent; //当前结点得父结点编号

   int k=0;

  ﻩwhile(parent!

=-1)

ﻩﻩ{

 ﻩif (child==HTree[parent]、LChild)ﻩ//左孩子标‘0’

   ﻩﻩHCodeTable[i]、code[k] ='0';

ﻩelse

 ﻩHCodeTable[i]、code[k]='1';//右孩子标‘1’

 ﻩﻩk++;

 ﻩchild =parent;ﻩ//迭代

 ﻩﻩparent=HTree[child]、parent;

ﻩﻩ}

ﻩﻩHCodeTable[i]、code[k]='\0';

Reverse(HCodeTable[i]、code);//将编码字符逆置 

ﻩ}

}

时间复杂度为O(n)

(4)生成编码串

将输入得字符串得每一个字符与编码表比较

voidHuffman:

Encode(char*d)//编码,d为编码后得字符串

{

ﻩ ﻩchar*s= str;    

while(*s!

='\0')

{

ﻩﻩﻩfor (inti=0;i

ﻩﻩﻩﻩif(*s==HCodeTable[i]、data)

ﻩﻩ{

ﻩﻩﻩstrcat(d,HCodeTable[i]、code); 

ﻩﻩﻩbreak;

ﻩﻩﻩ}

ﻩﻩs++;

ﻩ}

}

时间复杂度为O(n)

(5)解码:

算法过程:

从根到叶子---自顶向下

基于huffman树存储数组,从根结点开始,依据输入待解码串s中码字0或1,分别向左或右跟踪至叶子结点,叶子结点对应得字符(见码表),即为解码得到得字符;

只要s串为结束,重复上述过程

void Huffman:

:

Decode(char*s,char*d)ﻩ//解码,s为编码串,d为解码后得字符串

{

while(*s!

='\0')

{

ﻩintparent=2*n-2; ﻩﻩﻩ//根结点在HTree中得下标

  ﻩwhile (HTree[parent]、LChild!

=-1)   //如果不就是叶子结点

ﻩ{

ﻩif(*s=='0')

  parent= HTree[parent]、LChild;

  else

ﻩﻩparent=HTree[parent]、RChild;

ﻩs++;

ﻩﻩ}ﻩ

ﻩ*d = HCodeTable[parent]、data;

ﻩd++;

ﻩ}

}

时间复杂度为O(n)

2、3其她

 

(1)哈夫曼树得输出就是以凹入表示法来实现得,具体算法如下:

voidHuffman:

:

Print(int i,intm)

{

ﻩif(HTree[i]、LChild==-1)

ﻩcout<

else

{

ﻩcout<

ﻩPrint(HTree[i]、LChild,m+1);

ﻩﻩPrint(HTree[i]、RChild,m+1);

}

}

(2)统计字符頻数时,利用字符得ASCII码进行计数统计,调用了cin、get()函数

3、 程序运行

程序框图:

输入要编码得字符串

统计字符頻数

生成哈夫曼树

创建编码表

生成编码串

解码

结束

 

程序源代码:

#include

#include

usingnamespace std;

struct HNode 

{

ﻩintweight;//结点权值

intparent;  ﻩ//双亲指针

ﻩint LChild;ﻩ//左孩子指针

ﻩintRChild ;ﻩ//右孩子指针

}; 

s

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 外语学习 > 韩语学习

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1