6.练习14(a).doc

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
6.练习14(a).doc

6.练习14(a) 解:因每次将较大的段进栈,留下较小的段继续分划,所以,至多次分划留下的段长度为1,所以进栈的段至多。 7.分析当r取3时是否能在O(n)时间内求解选择问题?分析r=7时选择算法的时间复杂度。 解:当r=3 时,找不到满足α+1/31的正数α使得n-2*[(1/2)(n/3)] αn,[ ]表示向上取整。所以不能确定是否能在O(n)时间内用本节介绍的分治法求解。 当r=7时,大于mm的元素个数不超过 因此有:T(n)≤T(n/7)+T(5n/6)+cn≥15时成立。用归纳法可证明: T(n) ≤42cn 成立。 五、给定自然数1, … , n的一个排列,例如,(1, 3, 4, 2, 5),如果 j i 但j 排在i 的前面则称(j, i)为该排列的一个逆序。在上例中 (3, 2),(4, 2) 为该排列的逆序。该排列总共有2 个逆序。试用分治法 设计一个计算给定排列的逆序总数的算法,要求算法的时间复杂度 为Θ(nlog2n)。 提示:可在O(n)时间内算出2 段排好序的子序列之间的逆序数。例 如,(1, 2, 4, 8)为排在左边的子序列,(3, 5, 6, 7)为排在右边的子序 列,它们之间的逆序数可用一个线性时间的算法算出。 解、算法的伪代码如下: 解决:分别求解各自的逆序对数。如果子问题规模为2或1,可直接求解。 ??????????? 合并:此时虽然知道两个子序列各自的逆序对数,但两个子序列之间的逆序对数无法轻易获知,如果进行两两比较的话,合并操作的时间复杂度就是n2 ,分治法没有意义。 ??????????? 再考虑上述“合并”的问题,如果此时两个子序列都是有序的话,则通过修改合并排序的MERG过程就可以得出子序列之间的逆序数:在MERG对两个子序列的第一个元素之间进行选则时,如果前一个序列的首元素被选中,则逆序数不变——该元素不会和后一个序列中的剩下元素构成逆序对,如果第二个序列的首元素被选中,则逆序数增加“第一个序列剩下的元素数”——该元素和前一序列中剩下的每个元素构成逆序对,MERG后这些逆序对消除。分别求解各自的逆序对数。如果子问题规模为2或1,可直接求解。通过合并排序的MERG进行合并,在MERG过程累加逆序数。如果此时两个子序列都是有序的话,则通过修改合并排序的MERG过程就可以得出子序列之间的逆序数:在MERG对两个子序列的第一个元素之间进行选则时,如果前一个序列的首元素被选中,则逆序数不变——该元素不会和后一个序列中的剩下元素构成逆序对,如果第二个序列的首元素被选中,则逆序数增加“第一个序列剩下的元素数”——该元素和前一序列中剩下的每个元素构成逆序对,MERG后这些逆序对消除。 按Master定理,t(n)= Θ(nlogn) 练习6、分析下述求解最大-最小问题的程序所用的关键 字比较次数,要求给出精确的结果。 template class T bool MinMax(T w[], int n, T Min, T Max) { if (n 1) return false; if (n == 1) {Min = Max = 0; return true;} int s; if (n % 2) { Min = Max = 0; s = 1; } else { if (w[0] w[1]) { Min = 1; Max = 0; } else { Min = 0; Max = 1; } s = 2; } for (int i = s; i n; i += 2) { if (w[i] w[i+1]) { if (w[i] w[Max]) Max = i ; if (w[i+1] w[Min]) Min = i + 1; } else { if (w[i+1] w[Max]) Max = i + 1; if (w[i] w[Min]) Min = i; } } return true; } 首先分析for-循环部分所用的比较次数:因n-s为偶数,for循环共执行次循环体;每次执行循环体用了3次比较,所以共进行了次比较。 1)当n为奇数:s=1,用次比较,但=+--=-2 2)n为偶数:s=2,用+1次比较,而=-3+1=-2 所以,无论n为奇数还是偶数,程序14.1所用比较次数都是-2。

文档评论(0)

gshshxx + 关注
实名认证
内容提供者

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

1亿VIP精品文档

相关文档