网站大量收购闲置独家精品文档,联系QQ:2885784924

计算机算法基础 第2版 习题及答案 第3章 .docx

计算机算法基础 第2版 习题及答案 第3章 .docx

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

PAGE15

第3章 基于比较的排序

给出一例证明在最坏情况下,合并算法至少需要n1+n2-1次比较。

解:作为一个例子,如果数组A[1..n1]和数组B[1..n2]中数满足以下条件,那么合并算法需要n1+n2-1次比较:A[1]A[2]A[3]…A[n1-1]B[1]B[2]B[3]…B[n2]A[n1]。

(a) 设计一个复杂度为O(nlgn)的算法以确定数组A[1..n]中的n个数是否有相同的数字。

(b) 设计一个复杂度为O(nlgn)的算法把数组A[1..n]中出现奇数次的数字挑选出来。

解:这两个问题可以用排序来解决。我们假定n?2。

(a)Repeated-Number(A[1..n])

Heap-sort(A[1..n]) //用堆排序对A[1..n]进行排序

fori?2ton

ifA[i]=A[i-1]

thenreturn“Yes,A[i]andA[i-1]areidentical.” //报告A[i]和A[i-1]相同

endif

endfor

return“Norepeatednumbers.” //没有重复的数字

End

因为该算法的大部分时间化在第一步的排序,所以算法复杂度为O(nlgn)。

(b)Odd-occurrence(A[1..n])

Heap-sort(A[1..n]) //用堆排序对A[1..n]进行排序

s?A[1] //A[1]是第一个要检查的数

j?0 //出现奇数次的数将被按序放入B[1..j]

odd?true

fori:=2ton

ifs=A[i]

then ifodd=true

thenodd?false

elseodd?true

endif

else ifodd=false //A[i]有一个不同的值

then odd?true

s?A[i]

else j?j+1 //odd=true,记录到B中

B[j]?s

s?A[i] //odd仍然为true,未变

endif

endif

endfor

ifodd=true //最后一轮中,s=A[n],此时处理

then j?j+1

B[j]?s

endif

returnB[1..j]

End

因为该算法的大部分时间化在第一步的排序,其复杂度为O(nlgn),而后面步骤所需时间为O(n),所以算法复杂度为O(nlgn)。

(a) 一棵高为h?的堆最少和最多能含有多少个结点(包括所有内结点和叶结点)?

(b) 证明一个含有n个数的堆的高为?lgn?。

解?: (a) 当一棵高为h?的堆是一棵满二叉树时含有最多的结点。此时的结点数是:

Nmax(h)=1+2+22+23...+2h=2h+1–1。

当一棵高为h?的堆的底层只含有一个叶结点时,它含有的结点数最少。此时的结点数是:

Nmin(h)=Nmax(h-1)+1=2h。

(b) 设一个含有n个数的堆的高为h。从上题(a)可知:

Nmin(h)£n£Nmax(h),即

2h£n£2h+1–1,也就是

2h£n2h+1。

由此可得

h£lgnh+1。

所以有h=?lgn?。

假设Heap-Delete(A[1..n],i)表示将A[i]这个数从数组A[1..n]构成的堆中删去,并使所余n-1个数形成一个堆的操作。用伪码设计一个复杂度为O(lgn)的算法来实现Heap-Delete(A[1..n],i)(1?i?n)。

解:

Heap-Delete(A[1..n],i) //1?i?n

key←A[i]

A[i]?A[n]

n←n–1

ifi?n //如果i=n+1,则已被刪去

then ifkeyA[i]

then Max-Heapify(A[1..n],i)

else key←A[i]

Heap-Increase-Key(A[1..n],i,key)

endif

endif

End

假设Heap-Decrease-Key(A[1..n],i,key)表示在数组A[1..n]构

文档评论(0)

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

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

1亿VIP精品文档

相关文档