问题:
墙上的门 你正面临着一个两个方向无限延伸的墙。墙上有一扇门,但你既不知道多远,也不知道哪个方向。只有当你就在它旁边时才能看到门。设计一种算法,通过步行最多O(n)步骤到达门,其中n是您的初始位置和门之间的步数(未知)。
书中答案:
这里的关键思想是每次从初始位置指数地离开时左右走路。这个想法的一个简单实现是在到达门之前执行以下操作:对于i = 0,1,...,使2 i 向右走,返回到初始位置,make 2 i 向左走,然后再次返回初始位置。设2 (k-1)< n≤2 k 。此算法找到门所需的步数可在上面估算如下:
因此算法所做的步骤数为O(n)。 (注意:用更好的算法改善乘法常数并不困难。
我迷路的地方:
当它达到总和时我迷路了。有人可以向我解释这笔钱的工作原理吗?就像他们为什么将2 k 和2 i 乘以4和3?为什么他们将它与< 7·2 ķ?它是如何等于14·2 (k-1)与< 14N。我想我得到的事实是n = 2 (k-1)这可以解释总和的最后过去但是有很多问题。
答案 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
我们也可以在我们的抽象中使用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)