Предположим, вы получаете число (используя бит в двоичном кодировании).
Как быстро вы можете найти (или определить, что такое не существует) ?
Например, учитывая вход , можно вывести .
Наивный алгоритм для задачи будет проходить по всем возможным значениям для и искать значение которое удовлетворяет свойству.
Простое наблюдение состоит в том, что нет необходимости проверять значения меньшие, чем или больше, чем . Однако (даже если бы мы могли проверять только возможных значений на значение ), это приводит к неэффективному алгоритму, который экспоненциально влияет на размер входных данных.
Альтернативный подход заключается в том, чтобы просмотреть возможные значения (достаточно проверить ) и при каждой проверке на возможные значений. Затем мы можем использовать:
Таким образом, для данного нам нужно проверить только значений в диапазоне , Делая это с помощью бинарного поиска (когда фиксировано, монотонно возрастает по ), это дает полиномиальный алгоритм, работающий в .
Это все еще кажется мне неэффективным, и я думаю, что это может быть решено за линейное время (в размере ввода).