实验一 递归与分治策略

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

实验一 递归与分治策略
一、实验目的
(1)理解递归与分治策略算法设计思想和方法;
(2)培养学生的动手能力。

二、实验工具
(1)JDK1.8
(2)Eclipse IDE for Java EE Developers
三、实验题:
1、设n 个不同的整数排好序后存于T[0:n-1]中。

若存在下标i ,n i <≤0,使得T[i]=i ,设计一个有效算法找到这个下标。

要求算法在最坏情况下的计算时间为)(log n O 。

2、设子数组]1-:0[k a 和]1:[-n k a 已排好序10-≤≤n k 。

试设计一个合并这两个子数组为排好序的数组]1:0[-n a 的算法,要求算法在最坏情况下的计算时间为)(n O ,且只用到)1(O 的辅助空间。

三、实验提示:
1、由于n 个整数是不同的,因此对任意0≤i <n-1 有T[i]≤T[i+1]-1。

(1) 对于0<i <n ,当T[i]>i 时,对任意的i ≤j ≤n-2 有T[j]≥T[i]+j-i>i+j-i=j 。

(2) 对于0<i <n,当T[i]<i 时,对任意的0≤j ≤i 有T[j]≤T[i] -i+j <i-i +j =j 。

由①和②可知,用二分搜索算法可以在)(log n O 时间内找到所要求的下标,伪代码如下:
SEARCH(A,n)
low <-- 0
high <-- n-1
while low < high do
if A[middle] = middle
then return middle
if A[middle] < middle
then low <-- middle + 1
else
high <-- middle - 1
middle <-- (low+high)/2
if A[middle] = middle
then return middle
else
return -1
2、算法:循环换位合并算法
(1)向右循环换位合并
向右循环换位合并算法首先用二分搜索算法在数组段]1:[-n k a 中搜索]0[a 的插入位置,即找到位数p 使得]1[]0[][+≤<p a a p a 。

数组段]:0[p a 向右循环换位1+-k p 个位置,使得]1-[k a 移动到的位置][p a 。

此时,原数组元素]0[a 及其左边的所 有元素均已排好序。

对剩余的数组元素重复上述过程,直至只剩下一个数组段,此时 整个数组已排好序。

向右循环换位合并算法可描述如下:
MERGERFOR(A, k, length)
i <-- 0
j <-- k
while i<j and j<length
do p <-- binarySearch(A, a[i], j, length-1)
shiftright(a, i, p, p-j+1)
j <-- p+1;
i <-- i + p -j +2
其中,算法binarySearch(a, x, left, right)用于在数组段a[left:right]中搜索元素x 的插入位置。

BINARYSEARCH(A,x,left,right)
middle <-- 0
while left < right do
middle <-- (low+high)/2
if x = A[middle]
then return middle
if x > A[middle]
then left <-- middle + 1
else
right <-- middle - 1
if x > A[middle]
then return middle
else
return middle-1
算法shiftright(a,s,t,k)用于将数组段a[s:t]中元素循环右移位k 个位置。

SHIFTRIGHT(a,s,t,k)
for i <-- 0 to k-1
temp <-- a[t]
for j <-- s+1 to t
a[j] <-- a[j-1]
a[s] <-- temp
(2)上述算法中,数组段a[0:k-1]中元素的移动次数不超过k 次,数组段a[k:n-1]中元素最多移动一次。

因此算法的元素移动总次数不超过)(2k n k -+次。

算法的元素比较次数k)-klog(n 次。

当n <k 时,算法的计算时间为)(n O 。

而当)(n O k =时,算法的计算时间为)(2n O 。

由于数组段循环右移算法只用了)1(O 的辅助空间,所以整个算法所用的辅助空间为)1(O 。

四、实验报告要求
(1)独立完成实验内容;
(2)记录实验过程存在的问题,书写实验报告。

五、实验思考题。

相关文档
最新文档