- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
习题4.13
(b)元素最大交换次数:A9~A5 各1次;A4~A3 各2次;A2最多3次;A1最多4次(最多共需16次元素交换
4.13另解:
考虑第i个节点,其子节点为2i,则最多可交换1次;
若子节点有子节点22i, 则最多可交换2次;
若…..有子节点i×2k, 则最多可交换k次;
因此有
i×2k ≤ 19
求出满足上述不等式的最大的k值即可。
i=1时, k=4;
i=2时, k=3;
i=3或4时, k=2;
i=5~9时, k=1;
因此最多交换4+3+2×2+1×5=16次
6.5 用分治法求数组A[1…n]元素和,算法的工作空间是多少?
输入:数组A[1…n]
输出:数组的所有元素之和∑A[i] {i=1…n}
SUM(low, high)
if high = low then
return A[low]
else
mid←((low+high)/2(
s1←SUM(low,mid)
s2←SUM(mid+1, high)
return s1+s2
end if
工作空间:mid~((logn), s1s2~((1)(后序遍历树,不断释放空间,故为常数((1)),总的工作空间为((logn).
6.6 用分治法求元素x在数组A中出现的频次。
freq(A[low, high], x)
if high=low then
if A[low]=x then
return 1
else
return 0
end if
else
mid ←((low+high)/2(
f1 ←freq(A[low, mid])
f2 ← freq(A[mid+1, high])
return f1+f2
end if
复杂度:T(n)=T((n/2()+ T((n/2()≈2T(n/2) (设2k≤n2k+1)
=…=2kT(n/2k) =2kT(1) = n
6.16修改后的MERGESORT算法
最大比较次数
最小比较次数
令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 nlogm nm 且须有nm=O(nlogn), i.e., nm ≤ c·nlogn,
则须有m≤c·logn. 可令c=1,则m≤logn. 另一方面,
C(n) = 2kC(n/2k)+kn/2 = n/m×(m-1) + (n/2)log(n/m)= ((nlogn)
6.35
split(A[low,...high])
1. x←A[low] //备份为x
2. while (lowhigh){
3. while (lowhigh A[high]0) --high;
4. A[low] ←A[high]
5. while (lowhigh A[low]≤0) ++low;
A[high] ←A[low]
}
A[low] ← x //这时, low=high
7.3 动态规划法计算二项式系数,并分析其时间复杂度。
1. for i←1 to n
2. C[i,0] ← 1; C[i, i] ←1
3. end for
4. for i←2 to n
5. for j←1 to i-1 / min(k, i-1) //例如计算C[6,2]
6. C[i,j] ←C[i-1,j-1] + C[i-1,j]
7. end
8. end for
9. return C[n.k]
复杂度分析:
或
硬币的面值为1, 2, 4, 8, ..., 2k, 要兑换的值n2k+1,用贪心算法解这个问题,要求算法复杂度为O(logn)
输入:k+1个不同硬币的面值,其中包括单位币(面值为1)
输出:若要兑换的值n,给出各个面值硬币的数目num[0…k]
将k+1个不同的面值按递增顺序排列,记为Value[0...k]
num[0…k]←0
for j← k downto 0
num[j] ← (n/Value[j](
n←n - num[j]×Value[j]
end for
return num[0…k]
8.16 修改Dijkstra算法,使它找出最短路径和它的长度。
1. X={1}; Y←V-{1}; λ[1]←0; pre[1]←0;
2. for y←2 to n
3. if y 相邻于1 then λ[y]←lengt
文档评论(0)