惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

酷 壳 – CoolShell
酷 壳 – CoolShell
H
Hacker News: Front Page
P
Palo Alto Networks Blog
T
ThreatConnect
Apple Machine Learning Research
Apple Machine Learning Research
博客园_首页
T
True Tiger Recordings
P
Privacy & Cybersecurity Law Blog
B
Blog
IT之家
IT之家
Last Week in AI
Last Week in AI
F
Full Disclosure
Hacker News: Ask HN
Hacker News: Ask HN
C
Comments on: Blog
Microsoft Azure Blog
Microsoft Azure Blog
C
Cybersecurity and Infrastructure Security Agency CISA
Microsoft Security Blog
Microsoft Security Blog
博客园 - 【当耐特】
N
News and Events Feed by Topic
NISL@THU
NISL@THU
腾讯CDC
雷峰网
雷峰网
Security Latest
Security Latest
李成银的技术随笔
M
Microsoft Research Blog - Microsoft Research
L
LangChain Blog
L
Lohrmann on Cybersecurity
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
C
Check Point Blog
Y
Y Combinator Blog
Recent Announcements
Recent Announcements
博客园 - Franky
N
News | PayPal Newsroom
V
V2EX
A
About on SuperTechFans
The Register - Security
The Register - Security
月光博客
月光博客
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Google Online Security Blog
Google Online Security Blog
MyScale Blog
MyScale Blog
Cisco Talos Blog
Cisco Talos Blog
Vercel News
Vercel News
WordPress大学
WordPress大学
C
Cyber Attacks, Cyber Crime and Cyber Security
The Hacker News
The Hacker News
IntelliJ IDEA : IntelliJ IDEA – the Leading IDE for Professional Development in Java and Kotlin | The JetBrains Blog
IntelliJ IDEA : IntelliJ IDEA – the Leading IDE for Professional Development in Java and Kotlin | The JetBrains Blog
爱范儿
爱范儿
A
Arctic Wolf
L
LINUX DO - 最新话题
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More

博客园 - Anders Cui

jieba.NET与Lucene.Net的集成 jieba中文分词的.NET版本:jieba.NET 迷人的斐波那契数 - Anders Cui 趣题一则:交替放置的碟子 趣题一则:冯·诺依曼邻居问题 - Anders Cui HashSet的实现(下) HashSet的实现(上) 趣题一则:如何快速过桥? 制作自己的wikibook 玩儿一下Word Search Puzzle 整数的展开 离散数学拾趣(三):集合的子集有多少个 - Anders Cui 找零钱的两种方法 离散数学拾趣(二):逻辑难题 离散数学拾趣(一) 关于命名中的数量和人称 扩展方法浅谈 意外之喜 最近遭遇的两个VS配置
趣题一则:寻找那扇门
Anders Cui · 2012-04-10 · via 博客园 - Anders Cui

趣题一则:寻找那扇门

2012-04-10 23:51  Anders Cui  阅读(2484)  评论()    收藏  举报

现在出现在你面前的是一堵朝两个方向无限延伸的墙。墙上有一扇门,但你并不确定门离你有多远,也不知道门位于哪个方向(左边或是右边)。你只有在走到门面前才能看到它。假设从当前位置到门要走n步(n大小未知),那么怎样走O(n)步就能找到那扇门?

分析

这道题让人“左右为难”,因为不确定如何才能走到尽快确定方向和位置。首先想到在错误的方向上走得越远,就意味着离正确的位置越远,因此较为保险的方法是,第一步向右走,看看有没有门;第二步——为了防止在错误的方向上渐行渐远——向左走,走两步,这样就可以确定在最初位置的一步范围内有没有门了。

接下来,按照类似的方式左右徘徊,依次确定在最初位置的2,3,...,n有没有门了。不过,直觉上就会知道走了很多冤枉路,很可能不是O(n)了。下面来具体计算一下。

假设T(n)为按上述方法确定出左右各n步范围内是否有门所需要的步数,那么

T(1) = 2 + 1

T(2) = T(1) + 2*2 + 1

T(3) = T(2) + 2*3 + 1

...

T(n) = T(n-1) + 2*n + 1

两边相加,得T(n) = n^2 + 2*n,看来这个方法太慢了。

为了更好地分析慢的原因,我们从另一个角度来看上面的方法。将寻找门的过程看作一个个回合,初始位置标记为O,第一回合向右走一步,回到O,向左走一步,回到O;第二回合向右走二步,回到O,向左走二步,回到O;。。。;第n回合向右走n步,回到O,向左走n步,回到O。这样总的步数是4*(1+2+...+n)=2(n^2+n)。每个回合仅比上一回合多一步,造成的结果就是大量的重复。但如果考虑一种极端的情况,第一回合向右走n步,回到O,向左走n步,共n步,由于不知道n的大小,这算不上是一种有效的方法,但它说明,如果我们每个回合间的跨度够大,确实有可能达到O(n)。

在常见的渐进效率类型中,比多项式明显要大的是指数级,如2^n,这里先考察这种情况。即第i回合向右走2^i步,回到O,向左走2^i步,回到O,这里0<=i<=k且2^(k-1)<n<=2^k。这样经过k个回合就可以找到门的位置,总的步数是:

可以看到,这种新的回合制是符合要求的。接下来也许可以尝试更大的跨度,如3^n或n!甚至是n*n!,这里先不讨论了。

参考:

算法设计与分析基础