|
|
|
|
移动端

练习(1)

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

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

技术沙龙 | 6月30日与多位专家探讨技术高速发展下如何应对运维新挑战!


练习(1)

2.1 按增长率排列下列函数: N,N,N1.5,N2,N log N,N log log N,N log2N,N log(N2),2/N,2N,2N/2,37,N2logN,N3。指出哪些函数以相同的增长率增长。

2.2 设T1(N)=O(f(N))和T2(N)=O(f(N))。下列等式哪些成立?

a. T1(N)+T2(N)=O(f(N))

b. T1(N)-T2(N)=o(f(N))

c. T1(N)T2(N)=O(1)

d. T1(N)=O(T2(N))

2.3 哪个函数增长得更快: N log N,还是N1+ε/logN(ε>0)

2.4 证明对任意常数k,logkN=o(N)。

2.5 求两个函数f(N)和g(N)使得既不f(N)=O(g(N)),又不g(N)=O(f(N))。

2.6 在最近的一次法庭审理案件中, 一位法官因蔑视罪传讯一个城市并命令第一天交纳罚金2美元, 以后每天的罚金都要将上一天的罚金数额平方, 直到该城市服从该法官的命令为止(即, 罚金上升如下: $2,$4,$16,$256,$65536,…)。

a. 在第N天罚金将是多少?

b. 使罚金达到D美元需要多少天?(大O的答案即可)

2.7 对于下列六个程序片段中的每一个:

a. 给出运行时间分析(使用大O)。

b. 用Java语言编程, 并对N的若干具体值给出运行时间。

c. 用实际的运行时间与你所做的分析进行比较。

2.8 假设需要生成前N个整数的一个随机置换。例如,{4,3,1,5,2}和{3,1,4,2,5}就是合法的置换, 但{5,4,1,2,1}则不是, 因为数1出现两次而数3却没有。这个程序常常用于模拟一些算法。我们假设存在一个随机数生成器r, 它有方法randInt(i,j), 它以相同的概率生成i和j之间的整数。下面是三个算法:

1. 如下填入从a[0]到a[n-1]的数组a; 为了填入a[i], 生成随机数直到它不同于已经生成的a[0],a[1],…,a[i-1]时再将其填入a[i]。

2. 同算法(1), 但是要保存一个附加的数组, 称为used数组。当一个随机数ran最初被放入数组a的时候, 置used[ran]=true。这就是说, 当用一个随机数填入a[i]时, 可以用一步来测试是否该随机数已经被使用, 而不是像第一个算法那样(可能)用i步测试。

3. 填写该数组使得a[i]=i+1。然后

a. 证明这三个算法都生成合法的置换, 并且所有的置换都是可能的。

b. 对每一个算法给出你能够得到的尽可能准确的期望运行时间分析(用大O)。

c. 分别写出程序来执行每个算法10次, 得出一个好的平均值。对N=250,500,1000,2000运行程序(1); 对N=25000,50000,100000,200000,400000,800000运行程序(2); 对N=100000,200000,400000,800000,1600000,3200000,6400000运行程序(3)。

d. 将实际的运行时间与你的分析进行比较。

e. 每个算法的最坏情形的运行时间是什么?

2.9 用运行时间的估计值完成图2-2中的表, 这些时间太长无法模拟。插入上述三个算法的运行时间并估计计算100万个数的最大子序列和所需要的时间。你得出哪些假设?51

2.10 对于手工进行计算所使用的典型算法, 确定下列计算的运行时间:

a. 将两个N位数字的整数相加。

b. 将两个N位数字的整数相乘。

c. 将两个N位数字的整数相除。

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

51CTO读书频道二维码


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

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

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

读 书 +更多

Expert C# 2005 Business Objects中文版

本书描述了怎样应用面向对象的概念来进行.NET应用程序的架构、设计和开发。作者将重点放在了面向业务的对象,即业务对象和怎样在包括Web和...

订阅51CTO邮刊

点击这里查看样刊

订阅51CTO邮刊