算法(复习题)1
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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);