算法(复习题)1

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

平均情况:设待查找的元素在数组中的概率为P,不在数组中的概率为1-P,若出现在数组中每个位置的概率是均等的为p/n

T(n)=P1D1+P2D2+...+PiDi+(1-P)Dn+1

=p/2+n(1-p/2)

1.叙述分治算法和动态规划算法的基本思想,并比较两种算法的异同。答:分治法将待求解的问题划分成K个较小规模的子问题,对这K个子问题分别求解,再将子问题的解合并为一个更大规模的问题的解,自底向上逐步求出原问题的解. 动态规划将待求解的问题分解成若干的子问题,自底向上地通过求解子问题的解得到原问题的解。动态规划将每个子问题只求解一次并将其解保存在一个表格中,当需要再次求解此子问题时,只是简单的通过查表过的该子问题的解,避免了大量的重复计算.

异同:分治法求解的问题分解后的子问题都是独立的,而使用动态规划求解的问题分解后得到的子问题往往不是相互独立的。

分治法是自顶向下用递归的方法解决问题,而动态规划则是自底向上非递归解决问题。

1.简述分治算法求解过程的三个阶段。

答:(1)划分:既然是分治,当然需要把规模为n的原问题划分为k个规模较小的子问题,并尽量使这k个子问题的规模大致相同。

(2)求解子问题:各子问题的解法与原问题的解法通常是相同的,可以用递归的方法求解各个子问题,有时递归处理也可以用循环来实现。

(3)合并:把各个子问题的解合并起来,合并的代价因情况不同有很大差异,分治算法的有效性很大程度上依赖于合并的实现。

2.叙述分治法的基本思想,并分析分治法与减治法二者的区别。

答:分治法将待求解的问题划分成K个较小规模的子问题,对这K个子问题分别求解,再将子问题的解合并为一个更大规模的问题的解,自底向上逐步求出原问题的解.

区别:分治法是把一个大问题划分成若干个子问题,分别求解各个子问题,然后把子问题的解进行合并并得到原问题的解。减治法同样是把一个大问题划分成若干个子问题,但是这些子问题不需要分别求解,只需求解其中的一个子问题,因而也无需对子问题的解进行合并。

3.设计分治算法求一个数组中最大元素的位置,建立该算法时间复杂性的

递推式并给出其复杂性的大O表示。

答:设数组a1,a2...an

int maxpos(a[],i,j);

{if(i==j) return i;

mid=(i+j)/2;

lmaxpos=maxpos(a,i,mid);

rmaxpos=maxpos(a,mid+1,j);

if(a[lmaxpos]>=a[rmoxpos])

return lmaxpos;

else

return rmaxpos;}

T(1)=O(n) n=1;

T(n)=2T(n/2)+O(1) n>1;

求得复杂性为O(n)

4.阅读下面一段折半查找算法,回答问题。

int BinarySearch(int a[],int x,int n)

{

int left=0,right=n-1;

while(left<=right){

int middle=(left+right)/2;

if(x==a[middle]) return middle;

if(x>a[middle]) left=middle+1;

else right=middle-1;

}

return -1;

}

(1)给出该算法的复杂性递归方程,用展开法求解,并给出其渐进复杂性的大O表示。

T(1)=1 n=1 T(n)=T(n/2)+1 (n>=2) O(logn)

(2)修改折半查找算法使之能够进行范围查找。所谓范围查找是要找出在给定值a和b之间的所有元素(a≤b)。

int BinarySearch(int s[],int r,int l,a,b)

{

mid=(l+r)/2;

if(s[mid]>b) BinarySearch(s,mid-1,l,a.b);

else (s[mid]

else{输s[mid];

BinarySearch(s,mid-1,l,a,s[mid]);

BinarySearch (s,r,mid+1,s[mid],b);

}

5.什么是最优化问题?

答:最优化问题有n个输入,它的解由这n个输入的一个子集组成,这个

子集必须满足某些事先给定的条件,这些条件称为约束条件,满足约束

条件的解称为可行解。满足约束条件的可行解可能不只一个,为了衡量

这些可行解的优劣,事先给出一定的标准,这些标准通常以函数的形式

给出,这些标准函数称为目标函数。使目标函数取得极值(极大或极小)

的可行解称为最优解这类问题就称为最优化问题。

6.最大子段和问题:给定由n个整数组成的序列(a1, a2, …, an),最大子段

和问题要求该序列形如ai+…+aj的最大值(1≤i≤j≤n),当序列中所有整

数均为负整数时,其最大子段和为0。分别用蛮力法、分治法和动态规

划法设计求解最大子段和问题的算法的伪代码描述,并分析每种方法的

渐进复杂性。

(1)蛮力法

int maxsum (int n,int a[],int besti,int bestj){

int sum=0;

for(int i;i<=n;i++){

int thissum=0;

for(int j=i;j<=n;j++){

thissum +=a[j];

if(thissum>sum){

sum=thissum;

besti=i;

bestj=j;}}

}return sum;

}

基本操作为:第二个for循环中的条件语句,故复杂性为:O(n^2)。

(2)分治法

将a1,a2,……,an划分为两个长度相等的子序列a1,a2…..,an/2和an/2+1,an/2+2,……,an○1原序列最大子段和为前一个子序列的最大子段和。○2原序列最大子段和为后一个子序列的最大子段和。○3原序列的最大子段和=ai+….+aj 1<=i<=n/2 n/2+1<=j<=n ○1○2递归求解,○3s1=Max(ai+….+ak) (1<=i<=n/2) s2=Max(ak+…+aj)(n/2+1<=j<=n) 比较丧钟情况下的结果,取较大的为原问题的解。

复杂性方程为:T(1)=1 n=1,T(n)=2T(n/2)+n n>1;解得时间复杂度:O(nlogn)(3)动态规划法

int maxsum (int n,int a[]){

int sum=0,b=0;

for(int i=1;i<=n;i++){

if(b>0) b+=a[i];

else b=a[i];

if(b>sum) sum=b;}

return sum;}

递归方程 b(j)=b(j-1)+aj b(j-1)>0 b(j)=aj b(j-1)<=0

时间复杂度为:O(n)

7.给出贪心法的一般过程描述。

开始时解集S为空,然后使用选择函数按照某种贪心策略从候选集合C中

选择一个元素X,用可行函数去判断解集合S加入X后是否可行,把X合并

到解集合S中,并把他从候选集合C中删除,否则,丢弃X,从候选集合C

中根据贪心策略在选择一个元素,重复上述过程,只到找到一个满足解

决函数的完整解。

8.简述贪心法求解问题的两个特征,并说明贪心法和动态规划法的区别。答:最优子结构性质:当一个问题的最优解包含其子问题的最优解时,

称此问题具有最优子结构性质,也称此问题满足最优性原理。贪心选

择性质:所谓贪心选择性质是指问题的整体最优解可以通过一系列局

部最优的选择,即贪心选择来得到。

区别:动态规划算法是把一个复杂问题分解为若干个相互重叠的子问

题,通过求解子问题形成一系列决策得到原问题的解;而贪心法是把

一个复杂问题分解为一系列较为简单的局部最优选择,每一步选择都

是对当前的一个扩展,直到获得问题的完整解。

9.假设要在足够多的会场里安排一批活动,并希望使用尽可能少的会场。

设计一个有效的贪心算法进行会场安排。

相关文档
最新文档