课后练习 2.2

个人做的课后练习

书籍:算法设计与分析基础(第三版)

习题2.2

二.
a.正确
b.正确
c.错误
d.错误

三.
a.n的20次方
b.n
c.n的平方 log2(n)
d.3的n次方
e. log2(n)

四.
log(n) < n < n*log(n) < n的平方 < n的三次方 < 2的n次方 < n!

九.
a.线性对数
b.线性

十.
a.n
b.1
c.n
d.log(n)

十一.
因为我们不知道到底假币是比真币轻了还是重了。所以我们在此,把所有的硬币平均分成了三组。然后,我们再分别讨论可能出现的各种情况。假设总的硬币数目是n。
1. n = 3*k
刚好是三的整数倍,我们可以把硬币分成3堆,每一堆k个。然后我们只需称两次,就可以确定到底有假币到底是轻了还是重要。(分三堆,主要是为了构造成两个正确的样本和一个不正确的样本,从而确定不正确样本到底是轻了还是重了)
2. n = 3*k + 1或2
我们可以把硬币分成4堆,前三堆的每堆有k个,最后一堆只有1或2个。然后按照1.中的方法进行操作。如果发现两次的称量都是相等的话。我们就可以确认有问题的硬币在最后一堆那里,然后我们只需要从没有问题的前三堆硬币那里,取出与第四堆等价的硬币,然后再称量一次,就可以确认假币到底是轻了还是重了。

十二. 墙上的门
假设我们一开始所处的位置为0,而向左取正,向右取负。
1.假设我们只往一个方向走,显然,如果门在另一个方向我们就永远无法遇到门。
2.所以我们可以要不停的往返走,这样我们才能遇到门。
如果我们采取的策略是:
0 1 -1 2 -2 3 -3 4 -4 …
我们可以列出移动步数的数列:
0 1 2 3 4 5 6 7 8 …
移动步数的和为:S(n)=(2n-1)*n;S(-n)=(2n+1)*n
所以这些都是 O(n*n)的算法。

如果我们尝试采取走多一点再折返:
0 1 -2 3 -4 5 -6 7 -8 9 -10…
我们可以写出移动的步数的数列:
0 1 3 5 7 9 11 13 15 17 19…
移动步数的和为:S(n)=n*n
所以一样也是O(n*n)的算法。

如果我们选择一下类似的策略:
0 k -k*k k*k*k -k*k*k*k …
最终我们得出的求和公式大概就为:S(n)=n*n/k
因为,n的值可以取无限大,所以算法依然是属于O(n*n)类型的。

显然我们要跳出乘法的思维限制。
如果我们选择每逢 2的n次方 往反方向行走。
0 2 -4 8 -16 32 -64 128…
我们可以得到移动步数的数列:
0 2 6 12 24 48 96 192…
移动步数的和为:S(n)=3*n-4
所以,满足O(n)

再进一步思考一下,假设我们每逢 k的n次方 就往反方向行走。
我们得到移动步数和的式子为:S(n)=((2+k)n-n-2k)/(k-1)

但是,我们还有没有更加稳当的策略呢?
我个人想了想,我觉得还是有的,如果我们选择 每逢n! 就往反方向走。至于求和公式,暂时以我的能力我算不出来。但是我感觉当n趋向无穷的时候,这种方法的效率显然要比以上的几种做法都要高。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值