Интерполяционный поиск
Версия от 04:28, 12 июня 2011; Андрей Козлов (обсуждение | вклад)
Идея
Рассмотрим задачу: найти слово в словаре. Если оно начинается на букву "А", то никто не будет искать его в середине, а откроет словарь ближе к началу. В чем разница между алгоритмом человека и другими? Отличие заключается в том, что алгоритмы вроде двоичного не делают различий между "немного больше" и "существенно больше".
Алгоритм
Пусть
- отсортированный массив чисел из чисел, - значение, которое нужно найти. Если известно, что лежит между и , то следующая проверка выполняется примерно на расстоянии .Время работы
При условии, что значения элементов близки к арифметической прогрессии, за один шаг алгоритм уменьшает количество проверяемых элементов с
до . Поэтому среднее время работы алгоритма: . При "плохих" исходных данных (например, при экспоненциальном возрастании элементов) время работы может ухудшиться до .Реализация
Приведем код функции
на языке C++.
int interpolation_search(double* a, int n, double x)
{
int l = 0;
int r = n - 1;
int m;
while (a[l] <= x && x <= a[r])
{
mid = l + (x - a[l]) / (a[r] - a[l]) * (r - l);
if (a[m] == x)
return m;
if (a[m] < x)
l = m + 1;
else
r = m - 1;
}
if (a[l] == x)
return l;
else
return -1; // not found
}
Полезные ссылки
Д.Э. Кнут: Искусство программирования (том 3)
Wikipedia: Interpolation search