计算机算法设计与分析 动态规划 实验报告,《计算机算法设计与分析实验报告》.doc...

华北电力大学

实 验 报 告

|

|

实验名称 算法设计实验

课程名称 算法设计与分析

|

|

专业班级:信安1301 学生姓名:

学 号: 成 绩:

指导教师:胡朝举 实验日期: 2015年11月

实验一、归并排序(Merging Sort)

?实验内容

归并排序是一个非常优秀的排序方法,也是典型的分治策略的典型应用。实验要求:

(1)编写一个模板函数:

template

MergeSort(T *a, int n);

以及相应的一系列函数,采用分治策略,对任意具有:

bool operator

比较运算符的类型进行排序。

与STL库中的函数std::sort(..)进行运行时间上的比较,给出比较结果,如:动态生成100万个随机生成的附点数序列的排序列问题, 给出所用的时间比较。

归并排序就是将两个或两个以上的有序表合并成一个有序表的过程。将两个有序表合并成一个有序表的过程称为2-路归并。

假设初始序列含有n个记录,则可看成n个有序的子序列,每个字序列的长度为1,然后两两归并,得到[n/2]个长度为2或1的有序子序列;再两两归并,...,如此重复,直到一个长度为n的有序序列为止。

例 已知待排序记录的关键字序列为{49,38,65,97,76,13,27},给出2-路归并排序法进行排序的过程

2-路归并排序中的核心操作是,将待排序序列中前后相邻的两个有序序列归并为一个有序序列。相邻两个有序子序列的归并

设两个有序表存放在同一数组中相邻的位置上:R[low..mid]和R[mid+1..high],每次分被从两个表中取出一个记录进行关键字的比较,将较小者放入T[low..high]中,重复此过程,直至其中一个表为空,最后将另一非空表中余下的部分直接复制到T中。

1)时间复杂度当有n个记录时,需进行[log2n]趟归并排序,每一趟归并,其关键字比较次数不超过n,元素移动次数都是n,因此,归并排序的时间复杂度为O(nlog2n)。2)空间复杂度用顺序表实现归并排序时,需要和待排序记录个数相等的辅助存储空间,所以空间复杂度为O(n);—Huffman树及Huffman编码

实验内容

一个记录字符及出现频率的文件如下所示:

huffman.haf

7

a,45

b,13

c,12

d,16

e,9

f,5

试编写一个读取此种格式文件类CHuffman, 内部机制采用优先队列,用于建立Huffman树及进行Huffman编码输出,其用法可以如下所示:

CHuffman hm("huffman.dat");

hm.CreateTree();

hm.OutputTree();

hm.OutputCode(); //二进制形式的字符串

对于输出树的形式可自行决定(如图形界面或字符界面)。

二、?主要思想

该程序已封装为类在HuffmanCode.cpp中,该代码读取E:\h.dat路径下的数据文件,可以更改为用户输入的指定路径,但鉴于算法核心功能已经实现,不再加强此功能。另一点,此程序在建立完哈夫曼树后,不是使用遍历二叉树求解的方法而是使用直接从叶子节点出发,直接沿路径返回至根节点进行哈夫曼编码确定,不足之处是,结构体中多加了存储字段,消耗了更多内存。此外,向量已经给出了类似栈的操作,直接利用这一点,模仿优先队列进行操作,具体说明及实现在注释中已给出。

这个霍夫曼编码本身用到了贪心的思想,所以也在这里列举了出来。这个问题本身在计算机系的很多教材上都出现过。这里权且记录下来。霍夫曼的编码是这样的。假设我有一组带压缩的文本,里面各个字符出现的频率不同,现在需要对他们进行压缩。比如

假设我们有100,000个字符的文本.最直观的压缩办法就是原来每个字符要8个bits。现在我一共只有6个字符,那我就把每个字符用3个二进制 位来表示,这样所有100,000个字符用300,000个bit就可以表示了。这种是最直观的方案。但是霍夫曼提出的方案更精妙一些。他提出,基于每个 字符出现的频率不同,可以让出现次数多的字符用更少的二进制位来描述,出现次数少的字符用多一些二进制来描述。比如上图显示的这个Variable-length codeword里面。a出现的频率最高,所以用一个

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值