В качестве интервью я получил следующее сообщение:
Я думаю о положительном целом n. Придумайте алгоритм, который может угадать его в O (lg n) запросах. Каждый запрос - это номер вашего выбора, и я отвечу либо "ниже", "выше", либо "правильно".
Эта проблема может быть решена с помощью модифицированного бинарного поиска, в котором вы указываете полномочия от двух до тех пор, пока не найдете тот, который превышает n, а затем выполните стандартный бинарный поиск по этому диапазону. Я думаю, что это так круто в том, что вы можете искать бесконечное пространство для определенного числа быстрее, чем просто грубая сила.
Вопрос, который у меня есть, - это небольшая модификация этой проблемы. Вместо того, чтобы выбирать положительное целое число, предположим, что я выбираю произвольное рациональное число между нулем и единицей. Мой вопрос: какой алгоритм вы можете использовать для наиболее эффективного определения того, какое рациональное число я выбрал?
Прямо сейчас, лучшее решение, которое у меня есть, может найти p/q не более чем на O (q) раз, неявно пройдя дерево Stern-Brocot, двоичное дерево поиска по всем рациональным. Тем не менее, я надеялся получить время выполнения ближе к времени выполнения, которое мы получили для целочисленного случая, возможно, что-то вроде O (lg (p + q)) или O (lg pq). Кто-нибудь знает, как получить такое время выполнения?
Первоначально я рассматривал использование стандартного бинарного поиска интервала [0, 1], но это только найдет рациональные числа с не повторяющимся двоичным представлением, которое пропускает почти все рациональности. Я также подумал о том, чтобы использовать другой способ перечисления рациональных методов, но я не могу найти способ поиска этого пространства, если сравнивать простое/равное/меньшее.