-实验1分治法

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

一、实验目的

1.理解分治法的方法;

2. 掌握使用分治法解决一般问题的步骤;

3. 掌握分治算法求解数组的最大值和最小值的方法。

二、实验原理

在一个给定数组中查找最大值和最小值是一类常见的问题,也是解决其他一些算法的基础。

假设给定数组为a,数组中含有n个元素,一般的算法是在数组中进行直接

循环的次数在算法第2行给出,为(n-2)+1=n-1次,因此,算法元素比较总次数为2(n-1)次。

现在采用分治的思想,假设数组的长度为2的整数幂,将数组分割成两半,分别为a[0…(n/2)-1]和a[n/2…n-1],在每一半中分别查找最大值和最小值,并返回这两个最小值中的最小值以及两个最大值中的最大值。

假设给定数组为a,数组的下标上界和下界分别为low和high,则其算法伪

接比较数组的两个元素,选出最大值和最小值,此为函数的递归终止条件;代码第7行和第8行是两个递归调用,分别在数组的下标范围[low,mid]和

[mid+1,high]查找最小值和最大值,第9行比较两个最大值取其中较大者,第10行比较两个最小值取较大者。

代码的第2、9和10行涉及到元素的比较,第7、8行由于递归也产生元素比较,因此令算法总的元素比较次数为C(n),则有

⎩⎨⎧>+==2

2)2/(221)(n n C n n C 若若 对递推式进行求解

2

2/3 2

2)2/( 2)2(2 2

2...22)2/(2 ...

2

48)8/(824)2)8/(2(4 2

4)4/(42)2)4/(2(22)2/(2)(1

1122111-=-+=+=+++++==+++=+++=++=++=+=∑-=-----n n C n C n C n C n C n C n C n C k k j j

k k k k k 得到minmax 算法的元素比较总次数为3n/2-2,优于直接比较的性能。

三、实验内容及要求

1. 编写程序使用分治算法MINMAX 求解数组的最小值和最大值,并用实际数组对算法进行测试。

2. 要求算法中元素比较的次数为3n/2-2,在程序中元素比较的地方进行记录,并在程序末尾输出数组最大值和最小值以及元素比较次数。

四、实验步骤

1. 定义结构体类型或类,用以在函数的返回值同时返回数组的最大值和最小值。

3. 在main函数中使用给定数组{21,25,49,16,25,6,78,1}测试MINMAX函数

并输出元素比较次数,效果如下图所示。

五、思考和作业

1. 试修改程序MINMAX,使得当数组长度n不是2的整数幂也能运行,并分

析修改后算法的元素比较次数。

2. 使用分治算法解决最大子数组和问题,问题描述如下:

给定一个整数序列S,找出S中的连续子序列,使得该子序列和最大,要求

算法时间复杂性为Θ(nlogn)。例如:-2, 11, -4, 13, -5, -2; 结果为20: (11,

-4, 13)。

提示:

假定要寻找子数组S[low…high]的最大子数组,使用分治法将数组分解成

两个尽可能想相等的子数组,找到子数组中点mid,则S[low…high]中任何连续

数组S[i…j]必然是一下三种情况之一:

完全位于S[low…mid]中,low≤i≤j≤mid

完全位于S[mid+1…high]中,mid

跨越中点mid,low≤i≤mid

因此,S[low…high]的一个最大子数组所处的位置必然是三种情况之一。可

以通过递归方法求解A[low…mid]和A[mid+1…high]的最大子数组,则剩下的问

Part 1Part 2

the sub with largest sum may be in:

Part 1Part 2

or:

Part 1Part 2

recursion

The largest

is the

result

相关文档
最新文档