3+三+分治算法+习题参考答案.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
3三分治算法习题参考答案

第三章 分治算法习题 1、编写程序实现归并算法和快速排序算法 参见后附程序 2、用长为100、200、300、400、500、600、700、800、900、1000的10个数组的排列来统计这两种算法的时间复杂性。 有些同学用的微秒us 用s可能需要把上面的长度改为10000,……,100000,都可以 大部分的结果是快速排序算法要比归并算法快一些。 3、讨论归并排序算法的空间复杂性。 解析:归并排序由分解与合并两部分组成,如果用表示归并排序所用的空间。 则由 MergeSort(low, mid) //将第一子数组排序 MergeSort(mid+1, high) //将第二子数组排序 Merge(low, mid, high) //归并两个已经排序的子数组 则 递归推导得 又由存储数组长度为 ,则有 因此,空间复杂度为。 4、说明算法PartSelect的时间复杂性为 证明:提示:假定数组中的元素各不相同,且第一次划分时划分元素是第小元素的概率为。因为Partition中的case语句所要求的时间都是,所以,存在常数,使得算法PartSelect的平均时间复杂度可以表示为 令取试证明。 证明:令表示n个元素的数组A中寻找第k小元素的平均时间复杂度,因的时间复杂度是,故存在常数c,使得算法PartSelect的平均时间复杂度可以表示为 令且不妨设等式在时成立,则满足 以下用第二数学归纳法证明。取 当时,取cC/4,则 当时,成立。 对于一般的n,设对所有小于n的自然数成立,则 得证。 证明:(1)当时,假设数组A中元素互不相同。由于每个具有7个元素的数组的中间值u是该数组中的第4小元素,因此数组中至少有4个元素不大于u,个中间值中至少有个不大于这些中间值的中间值v。因此,在数组A中至少有 个元素不大于v。换句话说,A中至多有 个元素大于v。同理,至多有个元素小于v。这样,以v为划分元素,产生的新数组至多有个元素。当时,。 另一方面,在整个执行过程中,递归调用Select函数一次,涉及规模为,而下一次循环Loop涉及的数组规模为。程序中其他执行步的时间复杂度至多是n的倍数,用表示算法在数组长度为n的时间复杂度,则当时,有递归关系 用数学归纳法可以证明,。所以时间复杂度是。 (2)当时,使用上述方法进行分析,可知在进行划分后数组A中有至多个元素。而递归关系为。若通过归纳法证明出有的形式,用数学归纳法可以证明,。所以时间复杂度是。 归并排序的 C++语言描述 #includeiostream.h templateclass Tvoid MergeSort(T a[],int left,int right); templateclass Tvoid Merge(T c[],T d[], int l,int m,int r); templateclass Tvoid Copy(T a[],T b[],int l,int r); void main() { int const n(5); int a[n]; coutInput nnumbers please:; for(int i=0;in;i++) cina[i]; //for(int j=0;jn;j++) //b[j]=a[j]; MergeSort(a,0,n-1); coutThe sorted array isendl; for(i=0;in;i++) couta[i]; coutendl; } templateclass T void MergeSort(T a[],int left,int right) // { if(leftright) { int i=(left+right)/2; T *b=new T[]; MergeSort(a,left,i); MergeSort(a,i+1,right); Merge(a,b,left,i,right); Copy(a,b,left,right); } templateclass T void Merge(T c[],T d[],int l,int m,int r) {

文档评论(0)

haocen + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档