Интерполяционный поиск и бинарный поиск


13

Когда я должен использовать интерполяционный поиск вместо бинарного поиска?

Например, у меня есть отсортированный набор данных, в каких ситуациях я бы использовал бинарный поиск, чтобы найти элемент в этом наборе данных, или в какой ситуации я должен использовать интерполяционный поиск?

Какие свойства набора данных будут определяющим фактором?

Ответы:


12

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

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

Например, рассмотрим набор данных со строками строчных букв в качестве ключей. Предположим, у вас есть ключ, который начинается с «x». Поиск по интерполяции ясно покажет, что вы должны начать поиск очень близко к концу набора. Если, однако, большинство ваших ключей на самом деле начинаются с «z», и почти ни с одним из них ничего с «a», хотя «y», то искомый ключ может фактически оказаться очень близко к началу набора. Может пройти / может пройти значительное количество итераций, прежде чем поиск приблизится к началу, где находится строка, начинающаяся с 'w'. Каждая итерация удаляет из рассмотрения только ~ 10% набора данных, поэтому потребуется несколько итераций, чтобы приблизиться к началу, где ключи начинаются с 'w'

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

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

Следует также упомянуть, что при интерполяционном поиске необязательно использовать линейную интерполяцию. Например, если известно, что ваши ключи следуют некоторому нелинейному распределению (например, кривой колокола), становится довольно легко учесть это в функции интерполяции, чтобы получить результаты, немного отличающиеся от равномерного распределения.


1
Проблема, которую вы описываете, легко корректируется с помощью первого и последнего элементов для определения диапазона вместо предположения Int.MIN_VALUE и Int.MAX_VALUE, как я полагаю (по крайней мере, так я узнал алгоритм), как большинство это делают.
Malfist

2
@Malfist: Это может помочь, но не обязательно решит проблему. В этом примере, если бы у вас было ноль ключей, начиная с чего-либо (скажем) от «a» до «q», интерполяция прошла бы довольно гладко. Однако один выброс, который начался с a, сильно повлиял бы на производительность.
Джерри Гроб

1

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

Из Википедии по интерполяционному поиску:

Используя нотацию big-O, производительность алгоритма интерполяции для набора данных размером N равна O (N); однако в предположении о равномерном распределении данных по линейной шкале, используемой для интерполяции, производительность может быть показана как O (log log N).

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

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


0

Бинарный поиск и интерполяционный поиск рассматриваются как методы линейного поиска.

Они оба ожидают, что искомый список будет отсортирован по столбцу, называемому ключом . Это очень важно.

Двоичный поиск работает для строк или чисел, если они хранятся в отсортированном порядке. Основная идея бинарного поиска заключается в том, что он основан на изучении среднего элемента. Интерполяционный поиск является вариантом. Вместо использования точного среднего элемента он угадывает, где находится следующий элемент для сравнения с переданным значением. См. Ссылку, предоставленную ответом JB King или приведенную ниже в этом ответе, для получения подробной информации о том, как алгоритм поиска интерполяции вычисляет следующее значение ключа.

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

Google Книги - Классические структуры данных 2-е изд.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.