算法设计与分析实验指导书
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验一——串匹配问题
1.实验题目
给定一个文本,在该文本中查找并定位任意给定字符串。 2.实验目的
⑴ 深刻理解并掌握蛮力法的设计思想; ⑵ 提高应用蛮力法设计算法的技能;
⑶ 理解这样一个观点:用蛮力法设计的算法,一般来说,经过适度的努力后,都可以对算法的第一个版本进行一定程度的改良,改进其时间性能。 3.实验要求
⑴ 实现BF 算法;
⑵ 实现BF 算法的改进算法:KMP 算法和BM 算法;
⑶ 对上述三个算法进行时间复杂性分析,并设计实验程序验证分析结果。 4.实现提示
BF 算法、KMP 算法和BM 算法都是串匹配问题中的经典算法,BF 算法和KMP 算法请参见本章第2节。下面介绍BM 算法。
BM (Boyer -Moore )算法是Boyer 和Moore 共同设计的快速串匹配算法。BM 算法与KMP 算法的主要区别是匹配操作的方向不同。虽然BM 算法仅把匹配操作的字符比较顺序改为从右向左,但匹配发生失败时,模式T 右移的计算方法却发生了较大的变化。
为了方便讨论,假设字符表∑={a , b , …, y , z },BM 算法的关键是,对给定的模式T ="t 1t 2 … t m ",定义一个从字符到正整数的映射:
dist : c →{1, 2,… , m } (c ∈∑)
函数dist 称为滑动距离函数,它给出了正文中可能出现的任意字符在模式中的位置。函数dist 定义如下:
⎩⎨
⎧=-≤≤==-=c
t c m
m j c t j j j
m c dist m j 不出现在模式中或
若且}11|max{)(
例如,T ="pattern ",则dist (p )=6,dist (a )=5,dist (t )=3,dist (e )=2,dist (r )=1,dist (n )=7,字符表∑中的其他字符ch 的dist (ch )=7。
BM 算法的基本思想是:假设将主串中自位置i 起往左的一个子串与模式进行从右到左的匹配过程中,若发现不匹配,则下次应从主串的i +dist (s i )位置开始重新进行新一轮的匹配,其效果相当于把模式和主串均向右滑过一段距离dist (s i ),即跳过dist (s i )个字符而无需进行比较。
例如,给定主串S ="ababcabcacbab ",模式T ="abcac ",则dist (a )=1,dist (b )=3,dist (c )=5,BM 算法的匹配过程如图3.19所示。
因为在实际应用中,字符表中大部分字符不出现在模式串中,所以,应用BM 算法可以大大加快串匹配的速度。
实验项目二——最近对问题
1.实验题目
设p 1=(x 1, y 1), p 2=(x 2, y 2), …, p n =(x n , y n )是平面上n 个点构成的集合S ,设计算法找出集合S 中距离最近的点对。
第1趟匹配,i =4,j=4失败, dist(b)=3,i 滑动到7的位置 第2趟匹配,i =7,j=5失败,
dist(b)=3,i 滑动到10的位置
第
3趟匹配,T 中全部字符 都比较完毕,匹配成功 图3.19 BM 算法的匹配过程示例
(1)进一步掌握递归算法的设计思想以及递归程序的调试技术;
(2)理解这样一个观点:分治与递归经常同时应用在算法设计之中。
3.实验要求
(1)分别用蛮力法和分治法求解最近对问题;
(2)分析算法的时间性能,设计实验程序验证分析结论。
4.实现提示
蛮力法实现最近对问题的算法请参考3.6.1节,下面给出基于4.5.1节讨论的分治法求解最近对问题的算法。
实验项目三——八枚硬币问题
1.实验题目
在八枚外观相同的硬币中,有一枚是假币,并且已知假币与真币的重量不同,但不知道假币与真币相比较轻还是较重。可以通过一架天平来任意比较两组硬币,设计一个高效的算法来检测出这枚假币。
2.实验目的
(1)深刻理解并掌握减治法的设计思想;
(2)提高应用减治法设计算法的技能;
(3)理解这样一个观点:建立正确的模型对于问题的求解是非常重要的。
(1)设计减治算法实现八枚硬币问题;
(2)设计实验程序,考察用减治技术设计的算法是否高效; (3)扩展算法,使之能处理n 枚硬币中有1枚假币的问题。 4.实现提示
假设用一个数组B[n]表示硬币,元素B[i]中存放第i 枚硬币的重量,其中n -1个元素的值都是相同的,只有一个元素与其他元素值不同,则当n=8时即代表八枚硬币问题。由于八枚硬币问题限制只允许使用天平比较大小,所以,算法中只能出现元素相加和比较语句。
实验项目四——最大子段和问题
1.实验题目
给定由n 个整数(可能有负整数)组成的序列(a 1, a 2, , a n ),求该序列形如∑=j
i
k k
a 的
子段和的最大值,当所有整数均为负整数时,其最大子段和为0。 2.实验目的
(1)深刻掌握动态规划法的设计思想并能熟练运用;
(2)理解这样一个观点:同样的问题可以用不同的方法解决,一个好的算法是反复努力和重新修正的结果。 3.实验要求
(1)分别用蛮力法、分治法和动态规划法设计最大子段和问题的算法; (2)比较不同算法的时间性能; (3)给出测试数据,写出程序文档。 4.实现提示
蛮力法求解最大子段和问题的设计思想很简单,依次从第1个数开始计算长度为1、2、…、n 的子段和,将这一阶段的最大子段和保存起来,再从第2个数开始计算长度为1、2、…、n-1的子段和,将这一阶段的最大子段和与前一阶段求得的最大子段和比较,取较大者保存起来,依此类推,最后保存的即是整个序列的最大子段和。
分治法求解最大子段和问题的算法请参见4.4.1节。
动态规划法求解最大子段和问题的关键是要确定动态规划函数。记
)1(}
{max )(1n j a j b j
i
k k j
i ≤≤=∑=≤≤
则
)(max }max
{max max
1111j b a
a
n
j j
i
k k
j
i n
j j
i
k k
n
j i ≤≤=≤≤≤≤=≤≤≤==∑∑