Существует ли какое-либо исследование или теория, объединяющая бинарный поиск и интерполяционный поиск?

14

Я только что прочитал Можно ли считать этот алгоритм алгоритмом бинарного поиска? и вспомнил, что несколько лет назад я написал индексатор / поиск файлов журнала, чтобы найти записи журнала в больших текстовых файлах по окну даты / времени.

Делая это, я решил попробовать поиск по интерполяции (я не знал, как это называется, я сам наткнулся на эту идею). Затем по какой-то причине я продолжил идею чередования шагов интерполяции с шагами двоичного разбиения: на шаге 0 я интерполировал бы для определения контрольной точки, затем на шаге 1 я бы выбирал точную среднюю точку и т. Д.

Затем я провел сравнительный анализ системы, используя чистый интерполяционный поиск, чистый двоичный поиск и попытку комбинирования. Чередующийся подход был явным победителем, как по времени, так и по количеству тестов, необходимых для нахождения набора случайно выбранных времен.

Вдохновленный связанным вопросом, я просто сделал быстрый поиск «чередующийся интерполяционный поиск и бинарный поиск» и ничего не нашел. Я также попробовал «поиск по хеджированию», как было предложено в моем комментарии к одному из ответов.

Я наткнулся на известную вещь? Есть ли теоретическое обоснование того, что он быстрее для определенных типов данных? Файлы журнала обычно были большими по времени (например, 1-2 ГБ текста с, возможно, 10 миллионами строк для поиска), и распределение дат / времени в них было сложным с интенсивными всплесками активности, общим временем пиковых нагрузок и тихими временами. Мои контрольные тесты были взяты из равномерного распределения целевого времени, чтобы найти.

Нил Слэйтер
источник

Ответы:

5

Я наткнулся на известную вещь?

О(Lограмм Lограмм N)О(Lограмм N)

  • Интроспективный поиск - ваш метод (итерация между интерполяционным поиском и бинарным поиском). У меня нет более подробной информации.
  • Интерполяционно-бинарный поиск (IBS) Н. Санторо, Дж. Б. Сидни (1985).

    Общая идея заключается в том, что интерполяционный поиск полезен только тогда, когда искомый массив больше заданного порога. Когда рассматриваемый сегмент поиска меньше определенного пользователем порога, двоичный поиск применяется безоговорочно. И наоборот, сверх этого порога применяется шаг интерполяционного поиска, за которым в конечном итоге следует шаг двоичного поиска.

    Это имеет много общего с вашим подходом.

  • Адаптивный поиск (AS) Бьяджо Бонасера, Эмилио Феррара, Джакомо Фиумара, Франческо Пагано, Алессандро Проветти

    Используя слова авторов:

    [Интерполяционно-бинарный поиск] разработал аналогичное решение, которое объединяет (но не смешивает) вместе интерполяцию и бинарный поиск. Хотя асимптотическая сложность одинакова, есть некоторые заметные различия.

    [ПОРЕЗ]

    Следовательно, можно показать, что для любого ввода AS не будет выполнять более элементарных операций, чем IBS.

    Алгоритм может потратить до двойного числа операций по сравнению с «простым» интерполяционным поиском, тщательно выявляя лучшую половину поискового сегмента, что, в свою очередь, будет означать, что для выполнения потребуется меньше итераций (но у вас еще больше накладных расходов) ,

Manlio
источник
6

Чередование двух алгоритмов, чтобы получить лучшее из обоих миров, является известным приемом, хотя обычно указывается, что они запускаются параллельно и возвращают ответ, как только один из них завершается.

Хотя теоретически он быстрее, интерполяционный поиск имеет два недостатка по сравнению с бинарным поиском:

  • У него ужасная (линейная) производительность в худшем случае

  • Затраты на вычисление средней точки довольно велики; бинарная итерация поиска в сотни раз быстрее, чем интерполяционная

Я ожидаю, что подход, при котором вы выполняете интерполяционный поиск, когда диапазон большой, и переключаетесь на бинарный поиск, когда диапазон становится маленьким, является наиболее эффективным. Было бы хорошо, если бы вы могли попробовать этот эксперимент.

журналNжурналжурналNжурналNжурналжурналN

Я думаю, что ваши результаты можно объяснить двумя явлениями:

  • Сочетание с бинарным поиском позволяет избежать наихудшего поведения

  • Положительный эффект перехода на бинарный поиск по небольшому набору данных

Том ван дер Занден
источник
3
Вы писали: «Итерация бинарного поиска в сотни раз быстрее, чем итерация интерполяционного поиска». Обратите внимание, что в случае OP разница между вычислением средней точки в этих двух методах уменьшается за счет времени ввода-вывода, необходимого для получения значения средней точки.
Лиори
@liori: первые несколько итераций повторного бинарного поиска по одним и тем же данным могут быть более дружественными к кешу, потому что используются одни и те же элементы. Таким образом, четверти и, может быть, восьмые останутся горячими в кеше. Начинать с двоичного и переходить на интерполяцию после трех итераций может иметь смысл, если диапазоны достаточно велики. (Или если вы можете сделать асинхронный ввод-вывод и использовать тот результат, который прибывает первым).
Питер Кордес
Кроме того, даже при поиске в памяти промах в кэше (задержка более 200 циклов) в несколько раз превышает задержку даже 64-битного целочисленного деления (32-96 циклов), например , в Intel Haswell . 32-разрядное целочисленное деление значительно быстрее (22-29 циклов). Пропускная способность основной памяти является общим ресурсом для всех ядер, но целочисленное деление использует только ресурсы, дублированные на каждое ядро.
Питер Кордес
2
Тем не менее, задержка памяти намного хуже, чем пропускная способность памяти, поскольку даже несколько разрозненных обращений происходят быстрее, если они находятся в полете одновременно. Это выигрыш, чтобы предварительно выбрать (с prefetcht0инструкциями ) обе возможности для следующей итерации перед загрузкой текущей средней точки, для поиска в памяти на современном оборудовании x86. Вы не можете сделать это, если не можете заранее предсказать адреса следующей выборки. Таким образом, детали практической реализации могут быть значительными, кроме теоретических соображений .
Питер Кордес
@liori: Определенно, ввод / вывод на среднюю точку был основным фактором при индексации файла журнала, так как он читался по требованию для поиска записей. Вероятно, между вычислением смещения в файле и чтением блока было более двух порядков, поэтому решающим фактором будет число вычисленных средних точек. Я думаю, что если теперь я буду выполнять репликацию без файла журнала для индексации - что-то, что я постараюсь опубликовать здесь, - то, что не может быть существенной разницы в скорости, но может существовать измеримая разница «количества промежуточных точек».
Нил Слэйтер