免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2823 | 回复: 2
打印 上一主题 下一主题

墙上的门问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-08-25 15:47 |只看该作者 |倒序浏览
你面前是一堵朝两个方向无限延伸的墙。墙上有一扇门,但你并不知道门离你有多远,也不知道门位于哪个方向。你只有在走到门门前才能看到它。假设从当前位置到门要走n(事先并不知道n的大小)步,请设计一个算法,使你最多走O(n)步就能遇到门.

解法在网上找到拉,不过不清楚怎么想到的答案,具体的算法设计思路是什么?

论坛徽章:
0
2 [报告]
发表于 2008-08-25 15:54 |只看该作者
贴上网上的一个解答:

定义变量c,置为0.
首先,任意选择一个方向x.
a): 沿着x向前走2^c步.
b): 是否发现门? 若发现了,结束.
c): 若没发现,则向反方向走2^(c+1)-1+2^c步.
d): 是否发现门? 若发现了,结束.
e): ++c,返回a).

复杂度分析:
若2^(k-1) <n <=2^k.
我们考虑最差的情况:如果我们开始选的方向错了,那么,我们最多要走k+1个来回.
每个来回我们走了2^c+2^(c+1)-1+2^c=2^(c+2)-1步 (0 <=c <=k).
于是,总共要走: 2^2+2^3+...+2^(k+2)-(k+1)步.
求和,得到了:4*(2^(k+1)-1)-(k+1).
而4*(2^(k+1)-1)-(k+1) <4*2^(k+1) <16*2^(k-1) <16n.
于是,复杂度可以表示为O(n).

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
3 [报告]
发表于 2008-08-25 16:07 |只看该作者
先往一个方向走1m,如果过程中没找到门,再往反方向走3m,如果还没找到门,再反方向走9m,每次走的是刚才的三倍长度
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP