算法设计技巧与分析习题参考答案.docx
- 文档编号:12193239
- 上传时间:2023-04-17
- 格式:DOCX
- 页数:19
- 大小:99.43KB
算法设计技巧与分析习题参考答案.docx
《算法设计技巧与分析习题参考答案.docx》由会员分享,可在线阅读,更多相关《算法设计技巧与分析习题参考答案.docx(19页珍藏版)》请在冰豆网上搜索。
算法设计技巧与分析习题参考答案
习题4.13
A1
A2
A3
A4~A3各2次;A2
各1次;
(b)元素最大交换次数:
A9〜A5
最多3次;A1最多4次最多共需16次元素交换
4.13另解:
考虑第i个节点,其子节点为2i,则最多可交换1次;若子节点有子节点22i,则最多可交换2次;若….•有子节点i疋k,则最多可交换k次;
因此有
i泌<19
求出满足上述不等式的最大的k值即可。
i=1时,k=4;
i=2时,k=3;
i=3或4时,k=2;
i=5~9时,k=1;
因此最多交换4+3+22+1)5=16次
6.5用分治法求数组A[1…n]元素和,算法的工作空间是多少?
输入:
数组A[1-n]
输出:
数组的所有元素之和刀A[i]{i=1…n}
SUM(low,high)
1.ifhigh=lowthen
2.returnA[low]
3.else
4.midJ(low+high)/2
5.s1JSUM(low,mid)
6.s2JSUM(mid+1,high)
7.returns1+s2
8.endif
工作空间:
mid~(logn),s1&s2~
(1)(后序遍历树,不断释放空间,故为常数
(1)),总的工作空间为(logn).
6.6用分治法求元素x在数组A中出现的频次。
freq(A[low,high],x)
1.ifhigh=lowthen
2.ifA[low]=xthen
3.return1
4.else
5.return0
6.endif
7.else
8.midJ(low+high)/2
9.flJfreq(A[low,mid])
10.f2Jfreq(A[mid+1,high])
11.returnf1+f2
12.endif
复杂度:
T(n)=T(n/2)+T(n/2)〜2T(n/2)(设2k《<2k+1)=-=2kT(n/2k)=2kT
(1)=n
6.16修改后的MERGESORT算法
n1ifnm
最小比较次数C(n)2C(n/2)n/2ifnm
令n/2k=m^2,展开可知:
T(n)=2kT(n/2k)+kn-(2k-1)
=n/m>m(m-1)/2+nlog(n/m)-n/m+1
=n(m-1)/2+nlog(n/m)-n/m+1
若T(n)=(nlogn),其中表达式有nm,nlogn,nlogm,n/m等.
有n/m 则须有mlogn.可令c=1,贝UmWogn.另一方面, C(n)=2kC(n/2k)+kn/2=n/m(惦-1)+(n/2)log(n/m)=(nlogn) 6.35split(A[low,...high]) 1.xJA[low]//备份为x 2.while(low 3. --high; ++low; while(low 4.A[low]JA[high] 5.while(lowvhigh&&A[low]O) 6.A[high]JA[low] 7.} 8.A[low]Jx//这时,low=high k 7.3动态规划法计算二项式系数Cn,并分析其时间复杂度。 1.fori—Iton 2.C[i,0]—1;C[i,i]—1 3.endfor 4.fori—2ton 5.forj—1toi-1/min(k,i-1)〃例如计算C[6,2] 6.C[i,j]—C[i-1,j-1]+C[i-1,j] 7.end 8.endfor 9.returnC[n.k] 复杂度分析: ni-1 c i2j1 n ckcck(n1)O(nk) 8.5硬币的面值为1,2,4,8,…,2,要兑换的值n<2k+1,用贪心算法解这个问题,要求算法复杂度为O(logn) 输入: k+1个不同硬币的面值,其中包括单位币(面值为1)输出: 若要兑换的值n,给出各个面值硬币的数目num[0…k] 1.将k+1个不同的面值按递增顺序排列,记为Value[0...k] 2.num[0…k]T 3.forjJkdownto0 4.num[j]Jn/Value[j] 5.nJn-num[j]>A/alue[j] 6.endfor 7.returnnum[0…k] 8.16修改Dijkstra算法,使它找出最短路径和它的长度。 1.X={1};Y—V1};入[1]Jpre[1]J0; 2.fory J2ton 3. ify相邻于1thenX[y]Jlength[1,y] 4. 5. elseX[y]Jendif 6.endfor 7.forj J1t-o1n 8. 令y€Y,使得X[y为最小的 9. 10. XJXU{y}YJY-{y} 11. for每条边(y,w) 12. 13. 14. 14. ifw€YandX[y]+length[y,w] X[w]JX[y]+length[y,w]pre[w]Jyendif 15.endfor 16.endfor 输出最短路径 voidPrintPath(intnode)//输出格式为1^—>node {if(node==1)print(“1”); else{ PrintPath(pre[node]);//先递归再输出 print(J;node); 13.2考虑3着色问题,给出一个算法判断一图G=(V,E)的3着色向量c[1…n]是否是合法的。 输入: 图G=(V,E),向量c[1…n] 输出: flag=true若合法着色;否则flag=false 2.foriJ1ton 3.ifc[i]K0 4.for(i,j)€E 5.ifc[j]◎dc[j]=c[i] 6.returnfalse; 7.endif 8.endfor 9.endif 10.endfor 11.returntrue 13.3考虑3着色问题,给出一个算法判断一图G=(V,E)的3着色向量c[1…k]是否是部分的。 输入: 图G=(V,E),向量c[1…k] 输出: true若着色是部分的;否则输出false 2.foriJ1to 3.ifc[i]K0 4.for(i,j)€E 5.ifjwkndc[j]半0andc[j]=c[i] 6.returnfalse; 7.endif 8.endfor 9.endif 10.endfor 11.returntrue 13.10设计一个回溯算法来生成数字1,2,…,n的所有排列。 输入: 数字1,2,-,n 输出: 数字1,2,…的所有排列c[1,…向量 1.forkJ1ton 2.c[k]J0 3.endfor 5.kJ1 6.whilek>1 7.whilec[k]-卒n 8. c[k]Jc[k]+1 9. ifc为合法的thenoutputc (andgoto12) 10. elseifc为部分解thenk Jk+1 11. endwhile 12. c[k]J0 13. kJk-1 14.endwhile 14.7对二分查找算法进行随机化,即每次迭代时,随机选择剩下的位置代替搜索空间减半,假设在low与high之间每个位 置被选中的概率都是相同的。 比较这种随机化算法与二分查找的表现。 输入: n个元素的升序数组A[1…n]和元素x 输出: 若x=A[j],1jn,则输出j,否则输出0 1.lowJ1;highJn;jT 2.while(lowhigh)and(j=0) 3.midJ(low+high)/2/midJrandom(low,high) 4.ifx=A[mid]thenjJmid
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 算法 设计 技巧 分析 习题 参考答案
![提示](https://static.bdocx.com/images/bang_tan.gif)