Похоже, нужно выбрать большое число, достаточно большое, чтобы takes_a_long_time
не занимало слишком много времени, чтобы быть приемлемым. Запустите два потока: один, который начинает смотреть в сторону положительной бесконечности для диапазона, содержащего минимум, и другой, который начинает смотреть в сторону нуля для диапазона, содержащего минимум. Из-за экспоненциального увеличения времени 0 также может находиться на бесконечности, что касается поиска. Какой бы поток ни нашел результат, отмените другой.
Но тогда, если вы не хотите использовать преимущества нескольких ядер ЦП, не запускайте два потока (и если вы это делаете, не запускайте ровно два потока, запускайте по одному на ядро или около того). Просто чередуйте работу на стороне или на другой.
Учитывая эту базовую стратегию, теперь вам нужно настроить скорость, с которой вы приближаетесь к 0. Чем быстрее вы приближаетесь к нему, тем меньше шагов, чтобы найти минимум, если он действительно на этой стороне, но чем больше диапазон, оставшийся, чтобы быть двоичным искали, потому что в среднем вы будете "перебегать" дальше к нулю. Если кривая производительности является взаимно экспоненциальной, то, по-видимому, вы хотите сбросить как можно меньше, поэтому следует очень медленно приближаться к 0. Возможно даже, что ваша задача невыполнима в вычислительном отношении, «экспоненциальный» часто означает «невозможный».
Очевидно, я не могу ничего сказать о том, каким должно быть первоначальное «большое число». Сто терпимо? Это миллион? Номер Грэма? Если вы даже не знаете, что может иметь приемлемую производительность, вы можете узнать, запустив параллельно (опять же, через потоки или через ласточкин хвост) набор вычислений takes_a_long_time
для разных индексов, пока один из них не завершится. Опять же, нет никакой гарантии, что это выполнимо в вычислительном отношении - если каждый отдельный индекс, который помещается в память вашего компьютера, занимает не менее миллиарда лет, вы застряли на практике, даже если у вас есть теоретическое решение.