门在无限墙算法

时间:2014-10-06 16:18:14

标签: algorithm

问题:

  

墙上的门   你正面临着一个两个方向无限延伸的墙。墙上有一扇门,但你既不知道多远,也不知道哪个方向。只有当你就在它旁边时才能看到门。设计一种算法,通过步行最多O(n)步骤到达门,其中n是您的初始位置和门之间的步数(未知)。

书中答案:

  

这里的关键思想是每次从初始位置指数地离开时左右走路。这个想法的一个简单实现是在到达门之前执行以下操作:对于i = 0,1,...,使2 i 向右走,返回到初始位置,make 2 i 向左走,然后再次返回初始位置。设2 (k-1)< n≤2 k 。此算法找到门所需的步数可在上面估算如下:

     

some math

     

因此算法所做的步骤数为O(n)。 (注意:用更好的算法改善乘法常数并不困难。

我迷路的地方:

当它达到总和时我迷路了。有人可以向我解释这笔钱的工作原理吗?就像他们为什么将2 k 和2 i 乘以4和3?为什么他们将它与< 7·2 ķ?它是如何等于14·2 (k-1)与< 14N。我想我得到的事实是n = 2 (k-1)这可以解释总和的最后过去但是有很多问题。

2 个答案:

答案 0 :(得分:5)

4用于计算代表完整搜索的完整步骤数。所以,让我们说i = 1。

我们从x = 0开始。我们去2 ^ 1 = 2.那是2步。然后回到0.另外2个步骤。然后到-2,然后回到0.总共8个步骤,或4 x 2 ^ 1

4 x 2 ^ i =不成功搜索中我们返回原点以开始更大搜索的步数,因为我们只能左右移动,而不是传送

kth迭代是我们找到我们的门。最糟糕的情况是当门在n左侧时,n = 2 ^ k步。

那么当我们进入这个迭代时会发生什么?

我们从x = 0开始,我们向右移动2 ^ k,然后返回0,然后向左移动到-2 ^ k。完全遍历3 x 2 ^ k步。

至于为何与7 * 2 ^ k进行比较,我们知道ith搜索字词为2 ^ (k - 1)或以前的所有内容。根据我们之前关于k - 1 vs k

的定义,我们可以用7n替换7 * 2 ^ k

我们也可以在我们的抽象中使用2^k = 2 x 2^(k-1)这一事实。

Per @AbcAeffchen 2^(k−1) < n是假设的,因此您可以2^(k−1)替换n并获取14*2^(k−1) < 14n

答案 1 :(得分:0)

除了@ Compass的答案之外,我们需要将2 ^(k-1)替换为n,而不是2 ^ k,因为问题要求到达/找到门,门可能在左边的任何地方从第k次迭代的初始点开始走。所以我们有2 ^(k-1)