让我们说你站在巨大的墙前。 墙壁在你的右侧和左侧都是无限长的。你知道某个地方有一扇门,你试图找到它到达另一边。 可悲的是,现在是夜晚,你只能在你面前感受到墙壁的一部分。
你不知道门的距离或你必须走的方向,但你可以从起点开始计算你的步数。
你怎么解决这个问题?
天真的做法是从起点开始向右走+1,检查并且如果没有找到门,请转到开始并转到-1并再次检查。如果仍然没有门,你将不得不去开始并检查右边的+2等等....
这将导致找到门的O(n ^ 2)步(其中n是从起点到门的步数)。
有更好的方法吗?甚至可能在O(n)步骤中?
我甚至不知道我应该问什么标签,所以如果你认为它们合适,请随意添加一些。
答案 0 :(得分:2)
问题在于你不知道要走哪条路,所以无论你想出什么解决方案,你都必须回到起源并开始走另一条路。此外,你永远不能排除任何一个方向,直到你发现门让你回到原点任何次数与任何算法足够大n
(我假设n是距离来自原点的门。)
这意味着我们希望尽可能少地返回,但我们仍然必须这样做。解决方案是不将步长增加一个,而是将距离增加两倍。
为了简单而不伤害渐近的复杂性,我们将距离d移动到某个点,然后返回,向相反的方向移动相同的距离并最终再次返回。这只为我们的复杂性提供了4
,因此我们可以在以后忽略它。无论如何,当我谈论迭代时,它意味着所有这4条路线,即使你在最后一次迭代完成所有这些路线之前都会找到它。
因此,在第一步中,您可以前往第2层,第二层是第4层,然后是第8层,第16层等。
您将在第k次迭代中找到2^k >= n > 2^(k-1)
的门,即k >= log(n) > k-1
。为简单起见,我们可以假设n是2的幂,因为对于计算而言,如果n是例如33或64(或减去其中任何一个)并不重要,我们将在同一迭代中找到所有这些。所以我们可以写k = log(n)
。
您现在只是几何序列的一部分,所以在第k次迭代后,您将总共行进4 * 2*(2^k - 1)/(2 - 1) = 8 * (2^log(n) - 1) = 8 * (n - 1) = 8n - 8 = O(n)
。