Вопрос:
Дверь в стене Вы стоите лицом к стене, которая бесконечно тянется в обоих направлениях. В стене есть дверь, но вы не знаете ни как далеко, ни в каком направлении. Вы можете увидеть дверь, только когда находитесь рядом с ней. Разработайте алгоритм, который позволит вам добраться до двери, пройдя не более O (n) шагов, где n - (неизвестное вам) количество шагов между вашим начальным положением и дверью.
Ответ в книге:
Ключевая идея здесь - периодически ходить вправо и влево, каждый раз экспоненциально удаляясь от исходного положения. Простая реализация этой идеи состоит в следующем, пока дверь не будет достигнута: для i = 0,1, ... сделать 2 i шага вправо, вернуться в исходное положение, сделать 2 шага влево i и снова возвращение в исходное положение. Пусть 2 (k − 1)
k . Количество шагов, которые потребуется алгоритму для поиска двери, можно оценить выше следующим образом:
Следовательно, количество шагов, сделанных алгоритмом, равно O (n). (Примечание: нетрудно улучшить мультипликативную константу с помощью лучшего алгоритма.
Где я заблудился:
клей я клей (к-1) (к-1)
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
В дополнение к ответу @ Compass нам нужно заменить 2 ^ (k-1) на n, а не на 2 ^ k, так как вопрос просит добраться / найти дверь, дверь может быть везде слева при движении от начального точка на k-й итерации. Итак, у нас есть 2 ^ (k-1)
Похожие вопросы
Связанные вопросы
Новые вопросы
algorithm
Алгоритм - это последовательность четко определенных шагов, которые определяют абстрактное решение проблемы. Используйте этот тег, если ваша проблема связана с дизайном алгоритма.