
- •Аннотация
- •Введение
- •Теоретическая часть линейный поиск
- •Описание алгоритма
- •Бинарный поиск
- •Функция временной сложности и её асимптотическая оценка
- •Функция пространственной сложности и её асимптотическая оценка
- •График функции временной сложности для всех случаев
- •Интерполяционный поиск
- •Описание алгоритма
- •Функция временной сложности и её асимптотическая оценка
- •Функция пространственной сложности и её асимптотическая оценка
- •График функции временной сложности для всех случаев
- •Экспоненциальный поиск
- •Описание алгоритма
- •Функция временной сложности и её асимптотическая оценка
- •Функция пространственной сложности и её асимптотическая оценка
- •График функции временной сложности для всех случаев фибоначчиев поиск (Fibonacci Search)
- •Описание алгоритма
- •Функция временной сложности и её асимптотическая оценка
- •Функция пространственной сложности и её асимптотическая оценка
- •График функции временной сложности для всех случаев
- •Сравнение временной сложности всех алгоритмов
- •Практическая часть линейный поиск
- •Бинарный поиск
- •Интерполяционный поиск
- •Экспоненциальный поиск
- •Фибоначчиев поиск
- •Сравнение временной сложности экспериментальных значений.
- •Сравнение теоретических и экспериментальных значений
- •Заключение
- •Код программы
- •Линейный поиск
- •Бинарный поиск
- •Интерполяционный поиск
- •Экспоненциальный поиск
- •Фибоначчиев поиск
Функция пространственной сложности и её асимптотическая оценка
В итеративной версии бинарного поиска:
- Не требуется выделение дополнительной памяти для рекурсии.
- Используются только несколько переменных, в данном случае, указатели на границы массива.
График функции временной сложности для всех случаев
Интерполяционный поиск
(Interpolation Search)
Интерполяционный поиск — это алгоритм, работающий с отсортированными массивами. Он улучшает бинарный поиск, предполагая, что элементы массива распределены равномерно. Вместо деления массива пополам, как в бинарном поиске, интерполяционный поиск использует значение элемента, который мы ищем, чтобы приблизительно определить, где этот элемент находится.
Описание алгоритма
Используемая формула для вычисления предполагаемого индекса:
и
-
индексы
текущего диапазона
поиска.
и
- значения элементов в начале и конце
диапазона.
-
искомое значение.
Алгоритм использует метод интерполяции для предсказания индекса.
Пример:
Искомое значение: 42
Массив (отсортированный):
Формула для нахождения индекса:
Так
как
,
Проверяем по формуле:
Число найдено
Функция временной сложности и её асимптотическая оценка
Лучший случай
Лучший случай наступает, если искомый элемент оказывается на предполагаемой позиции на первой итерации. Это возможно, если позиция искомого элемента равна середине массива.
Средний случай
В среднем случае интерполяционный поиск работает быстрее, чем бинарный поиск, если массив распределён равномерно.
За
один шаг алгоритм уменьшает количество
проверяемых элементов с n
до
где
m
зависит
от степени равномерности массива.
То
есть, после k-ого шага количество
проверяемых элементов уменьшается до
.
Завершение
поиска: интервал становится длины 1,
m - параметр, который определяет, насколько быстро уменьшается длина интервала на каждом шаге и зависит от степени равномерности распределения данных.
Худший случай
Если данные распределены неравномерно, интерполяционный поиск теряет свою эффективность. В крайних случаях (например, когда большинство значений одинаковы, а искомое значение сильно отличается), алгоритм может работать как линейный поиск.
В этом случае:
Функция пространственной сложности и её асимптотическая оценка
Интерполяционный поиск выполняется итеративно и не требует дополнительной памяти для хранения промежуточных структур данных или рекурсивных вызовов.
Что хранится в памяти:
Начальный и конечный индексы
для текущего подмассива.
Позиция вычисленного индекса поиска (
).
Дополнительные константные переменные для выполнения операций (например, ключ поиска и размер массива).
Таким образом, пространственная сложность интерполяционного поиска составляет:
График функции временной сложности для всех случаев
Экспоненциальный поиск
(Exponential Search)
Экспоненциальный поиск — это алгоритм поиска в отсортированном массиве. Он используется для быстрого определения диапазона, где может находиться искомый элемент. После определения диапазона выполняется бинарный поиск внутри этого диапазона.
Алгоритм начинается с поиска индекса, который экспоненциально увеличивается (1, 2, 4, 8, ...), пока не будет найден подходящий диапазон, содержащий искомый элемент.