Я только что прочитал Можно ли считать этот алгоритм алгоритмом бинарного поиска? и вспомнил, что несколько лет назад я написал индексатор / поиск файлов журнала, чтобы найти записи журнала в больших текстовых файлах по окну даты / времени.
Делая это, я решил попробовать поиск по интерполяции (я не знал, как это называется, я сам наткнулся на эту идею). Затем по какой-то причине я продолжил идею чередования шагов интерполяции с шагами двоичного разбиения: на шаге 0 я интерполировал бы для определения контрольной точки, затем на шаге 1 я бы выбирал точную среднюю точку и т. Д.
Затем я провел сравнительный анализ системы, используя чистый интерполяционный поиск, чистый двоичный поиск и попытку комбинирования. Чередующийся подход был явным победителем, как по времени, так и по количеству тестов, необходимых для нахождения набора случайно выбранных времен.
Вдохновленный связанным вопросом, я просто сделал быстрый поиск «чередующийся интерполяционный поиск и бинарный поиск» и ничего не нашел. Я также попробовал «поиск по хеджированию», как было предложено в моем комментарии к одному из ответов.
Я наткнулся на известную вещь? Есть ли теоретическое обоснование того, что он быстрее для определенных типов данных? Файлы журнала обычно были большими по времени (например, 1-2 ГБ текста с, возможно, 10 миллионами строк для поиска), и распределение дат / времени в них было сложным с интенсивными всплесками активности, общим временем пиковых нагрузок и тихими временами. Мои контрольные тесты были взяты из равномерного распределения целевого времени, чтобы найти.
источник
prefetcht0
инструкциями ) обе возможности для следующей итерации перед загрузкой текущей средней точки, для поиска в памяти на современном оборудовании x86. Вы не можете сделать это, если не можете заранее предсказать адреса следующей выборки. Таким образом, детали практической реализации могут быть значительными, кроме теоретических соображений .