|
|
|
|
移动端

练习(2)

《数据结构与算法分析:Java语言描述(原书第3版)》第2章算法分析,本章对如何分析程序的复杂性给出一些提示。遗憾的是, 它并不是完善的分析指南。简单的程序通常给出简单的分析, 但是情况也并不总是如此。本节为本章的练习部分。

作者:冯舜玺/陈越 译来源:机械工业出版社|2016-04-13 11:48

年前最后一场技术盛宴 | 1月27日与京东、日志易技术大咖畅聊智能化运维发展趋势!


练习(2)

2.11 一个算法对于大小为100的输入花费0.5ms。如果运行时间如下, 则解决输入量大小为500的问题需要花费多长的时间(设低阶项可以忽略):

a. 是线性的

b. 为O(N log N)

c. 是二次的

d. 是三次的

2.12 一个算法对于大小为100的输入花费0.5ms。如果运行时间如下, 则用1分钟可以解决多大的问题(设低阶项可以忽略):

a. 是线性的

b. 为O(N log N)

c. 是二次的

d. 是三次的

2.13 计算f(x)=∑Ni=0aixi需要多少时间?

a. 用简单的例程执行取幂运算。

b. 使用2.4.4节的例程计算。

2.14 考虑下述算法(称为Horner法则)计算f(X)=∑Ni=0aixi的值:

a. 对x=3,  f(x)=4x4+8x3+x+2指出该算法的各步是如何进行的。

b. 解释该算法为什么能够解决这个问题。

c. 该算法的运行时间是多少?

2.15 给出一个有效的算法来确定在整数A1<A2<A3<…<AN的数组中是否存在整数i使得Ai=i。你的算法的运行时间是多少?

2.16 基于下列各式编写另外的gcd算法(其中a>b)

gcd(a,b)=2gcd(a/2,b/2)若a和b均为偶数。

gcd(a,b)=gcd(a/2,b)若a为偶数, b为奇数。

gcd(a,b)=gcd(a,b/2)若a为奇数, b为偶数。

gcd(a,b)=gcd((a+b)/2,(a-b)/2)若a和b均为奇数。52

2.17 给出有效的算法(及其运行时间分析):

a. 求最小子序列和。

b. 求最小的正子序列和。

c. 求最大子序列乘积。

2.18 数值分析中一个重要的问题是对某个任意的函数f找出方程f(X)=0的一个解。如果该函数是连续的并有两个点low和high使得f(low)和f(high)符号相反, 那么在low和high之间必然存在一个根, 并且这个根可以通过折半查找求得。写出一个函数, 以f、 low和high为参数, 并且解出一个零点。(为了实现一个泛型函数作为参数, 我们传递一个函数对象, 让该对象实现Function接口, 而这个Function接口含有一个方法f)为保证能够终止, 你必须要做什么?

2.19 课文中最大相连子序列和算法均不给出具体序列的任何指示。将这些算法修改使得它们以单个对象的形式返回最大子序列的值以及具体序列的那些相应下标。

2.20 a. 编写一个程序来确定正整数N是否是素数。

b. 你的程序在最坏情形下的运行时间是多少(用N表示)?(你应该能够以O(N)来完成这项工作)

c. 令B等于N的二进制表示法中的位数。B的值是多少?

d. 你的程序在最坏情形下的运行时间是什么(用B表示)?

e. 比较确定一个20(二进制)位的数是否是素数和确定一个40(二进制)位的数是否是素数的运行时间。

f. 用N或B给出运行时间更合理吗?为什么?

2.21 厄拉多塞(Erastothenes)筛是一种用于计算小于N的所有素数的方法。我们从制作整数2到N的表开始。找出最小的未被删除的整数i, 打印i, 然后删除i,2i,3i,…。当i>N时, 算法终止。该算法的运行时间是多少?

2.22 证明X62可以只用8次乘法算出。

2.23 不用递归, 写出快速求幂的程序。

2.24 给出用于快速取幂运算中的乘法次数的精确计数。(提示: 考虑N的二进制表示)

2.25 程序A和B经分析发现其最坏情形运行时间分别不大于150N log2N和N2。如果可能, 请回答下列问题:

a. 对于N的大值(N>10000), 哪一个程序的运行时间有更好的保障?

b. 对于N的小值(N<100), 哪一个程序的运行时间有更好的保障?

c. 对于N=1000, 哪一个程序平均运行得更快?

d. 对于所有可能的输入, 程序B是否总能够比程序A运行得更快?53

2.26 大小为N的数组A, 其主元素是一个出现超过N/2次的元素(从而这样的元素最多有一个)。例如, 数组

3,3,4,2,4,4,2,4,4

有一个主元素4, 而数组

3,3,4,2,4,4,2,4

没有主元素。如果没有主元素, 那么你的程序应该指出来。下面是求解该问题的一个算法的概要:

首先, 找出主元素的一个候选元(这是困难的部分)。这个候选元是唯一有可能是主元素的元素。第二步确定是否该候选元实际上就是主元素。这正好是对数组的顺序搜索。为找出数组A的一个候选元, 构造第二个数组B。比较A1和A2。如果它们相等, 则取其中之一加到数组B中; 否则什么也不做。然后比较A3和A4, 同样, 如果它们相等, 则取其中之一加到B中; 否则什么也不做。以该方式继续下去直到读完整个的数组。然后, 递归地寻找数组B中的候选元; 它也是A的候选元(为什么)。

a. 递归如何终止?

*b. 当N是奇数时的情形如何处理?

*c. 该算法的运行时间是多少?

d. 我们如何避免使用附加数组B?

*e. 编写一个程序求解主元素。

2.27 输入是一个N×N数字矩阵并且已经读入内存。每一行均从左到右递增。每一列则从上到下递增。给出一个O(N)最坏情形算法以决定数X是否在该矩阵中。

2.28 使用正数的数组a设计有效的算法以确定:

a. a[j]+a[i]的最大值, 其中j≥i。

b. a[j]-a[i]的最大值, 其中j≥i。

c. a[j]*a[i]的最大值, 其中j≥i。

d. a[j]/a[i]的最大值, 其中j≥i。

2.29 在我们的计算机模型中为什么假设整数具有固定长度是重要的?

2.30 考虑第1章中描述的字谜游戏。假设我们固定最长单词的大小为10个字符。

a. 设R、 C和W分别表示字谜游戏中的行数、 列数和单词个数, 那么在第1章所描述的那些算法用R、 C和W表示的运行时间是多少?

b. 设单词表是预先排序过的。指出如何使用折半查找得到一个具有少得多的运行时间的算法。54

2.31 设在折半查找程序的第15行的语句是low=mid而不是low=mid+1。这个程序还能正确运行吗?

2.32 实现折半查找使得在每次迭代中只执行一次二路比较。(课文中的实现使用了三路比较。假设只有方法lessThan是可用的。)

2.33 设算法3(见图2-7)的第15行和第16行由

代替, 这个程序还能正确运行吗?

2.34 三次的最大子序列和算法的内循环执行N(N+1)(N+2)/6次最内层代码的迭代。相应的二次算法执行N(N+1)/2次迭代。而线性算法执行N次迭代。哪种模式是显然的?你能给出这种现象的组合学解释吗?

喜欢的朋友可以添加我们的微信账号:

51CTO读书频道二维码


51CTO读书频道活动讨论群:342347198

【责任编辑:book TEL:(010)68476606】

回书目   上一节   下一节
点赞 0
分享:
大家都在看
猜你喜欢

读 书 +更多

ASP网络编程从入门到精通

本书是为那些对Web开发感兴趣的读者而编写的。ASP(Active Server Pages)是微软公司在Web领域的又一次突破,它打破了以往只能由专业人员来...

订阅51CTO邮刊

点击这里查看样刊

订阅51CTO邮刊