Если интерполяционный поиск с первого раза не попал в нужный индекс, алгоритм повторяет процесс, сужая диапазон поиска. Давайте разберем это подробнее! 🧐
Как это работает шаг за шагом 🛠️
1. Расчет позиции
Интерполяционный поиск вычисляет предполагаемую позицию искомого элемента (`pos`) на основе текущих границ диапазона:
pos = left + ((target - arr[left]) * (right - left)) // (arr[right] - arr[left])
Здесь:
- left и right — текущие границы поиска.
- target — значение, которое мы ищем.
- arr[pos] — элемент массива на предполагаемой позиции.
2. Сравнение значения в `arr[pos]` с target
- Если arr[pos] == target, элемент найден. 🎯
- Если arr[pos] < target, это означает, что искомое значение находится правее. Тогда обновляем left = pos + 1.
- Если arr[pos] > target, это означает, что искомое значение находится левее. Тогда обновляем right = pos - 1.
3. Повторение процесса
Суженные границы используются для пересчета новой позиции pos, и алгоритм повторяется, пока:
- Либо не будет найдено значение.
- Либо диапазон не станет пустым (`left > right`), что указывает, что элемент отсутствует в массиве. ❌
Пример пошагового поиска 👇
Допустим, у нас есть массив:
arr = [10, 20, 30, 40, 50, 60, 70, 80, 90]
Мы ищем число 65.
1. Первый расчет позиции:
pos = 0 + ((65 - 10) * (8 - 0)) // (90 - 10) = 4
Проверяем arr[4]: это 50.
2. Искомое значение больше 50, сужаем диапазон:
left = 4 + 1 = 5.
3. Второй расчет позиции:
pos = 5 + ((65 - 60) * (8 - 5)) // (90 - 60) = 5
Проверяем arr[5]: это 60.
4. Искомое значение больше 60, сужаем диапазон:
left = 5 + 1 = 6.
5. Третий расчет позиции:
pos = 6 + ((65 - 70) * (8 - 6)) // (90 - 70) = 6
Проверяем arr[6]: это 70.
6. Диапазон исчерпан, элемент отсутствует. 🚫
Как это влияет на эффективность? 🚀
- Если распределение данных равномерное, алгоритм быстро сужает диапазон и достигает искомого значения за O(log log n).
- Если данные неравномерные, расчет позиции может быть ошибочным, и алгоритм потребует больше итераций, вплоть до O(n).
Заключение ✨
Интерполяционный поиск — умный подход к поиску, который оптимизирует количество проверок, оценивая, где "примерно" находится искомый элемент. Если с первого раза не попали в цель, алгоритм просто повторяет попытку, сужая диапазон. 🔄
Это мощный инструмент, но срабатывает лучше всего, когда данные распределены равномерно. Хотите попробовать его в деле? Вперед! 🚀