Вопрос:

Дверь в стене Вы стоите лицом к стене, которая бесконечно тянется в обоих направлениях. В стене есть дверь, но вы не знаете ни как далеко, ни в каком направлении. Вы можете увидеть дверь, только когда находитесь рядом с ней. Разработайте алгоритм, который позволит вам добраться до двери, пройдя не более O (n) шагов, где n - (неизвестное вам) количество шагов между вашим начальным положением и дверью.

Ответ в книге:

Ключевая идея здесь - периодически ходить вправо и влево, каждый раз экспоненциально удаляясь от исходного положения. Простая реализация этой идеи состоит в следующем, пока дверь не будет достигнута: для i = 0,1, ... сделать 2 i шага вправо, вернуться в исходное положение, сделать 2 шага влево i и снова возвращение в исходное положение. Пусть 2 (k − 1) k . Количество шагов, которые потребуется алгоритму для поиска двери, можно оценить выше следующим образом:

some math

Следовательно, количество шагов, сделанных алгоритмом, равно O (n). (Примечание: нетрудно улучшить мультипликативную константу с помощью лучшего алгоритма.

Где я заблудился:

клей я клей (к-1) (к-1)

9
user2978420 6 Окт 2014 в 20:18

2 ответа

Лучший ответ

Число 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) или все, что было раньше. Мы можем заменить 7 * 2 ^ k на 7n на основе нашего предыдущего определения относительно 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

5
Compass 6 Окт 2014 в 16:55

В дополнение к ответу @ Compass нам нужно заменить 2 ^ (k-1) на n, а не на 2 ^ k, так как вопрос просит добраться / найти дверь, дверь может быть везде слева при движении от начального точка на k-й итерации. Итак, у нас есть 2 ^ (k-1)

0
user3402053 18 Апр 2017 в 02:27