- •Аннотация
- •Введение
- •Теоретическая часть линейный поиск
- •Описание алгоритма
- •Бинарный поиск
- •Функция временной сложности и её асимптотическая оценка
- •Описание алгоритма
- •Функция временной сложности и её асимптотическая оценка
- •Функция пространственной сложности и её асимптотическая оценка
- •График функции временной сложности для всех случаев
- •Экспоненциальный поиск
- •Функция пространственной сложности и её асимптотическая оценка
- •График функции временной сложности для всех случаев
- •Интерполяционный поиск
- •Описание алгоритма
- •Функция временной сложности и её асимптотическая оценка
- •Функция пространственной сложности и её асимптотическая оценка
- •График функции временной сложности для всех случаев фибоначчиев поиск (Fibonacci Search)
- •Описание алгоритма
- •Функция временной сложности и её асимптотическая оценка
- •Функция пространственной сложности и её асимптотическая оценка
- •График функции временной сложности для всех случаев
- •Сравнение временной сложности всех алгоритмов
- •Практическая часть линейный поиск
- •Бинарный поиск
- •Интерполяционный поиск
- •Экспоненциальный поиск
- •Фибоначчиев поиск
- •Сравнение временной сложности экспериментальных значений.
- •Сравнение теоретических и экспериментальных значений
- •Заключение
- •Код программы
- •Линейный поиск
- •Бинарный поиск
- •Интерполяционный поиск
- •Экспоненциальный поиск
- •Фибоначчиев поиск
Теоретическая часть линейный поиск
(Linear Search)
Линейный поиск - простой алгоритм поиска, который заключается в последовательном просмотре всех элементов массива или списка до тех пор, пока не будет найден искомый элемент либо не будет достигнут конец структуры данных.
Описание алгоритма
Начинаем с первого элемента массива.
Сравниваем текущий элемент с искомым значением.
Если элемент совпадает с искомым значением, поиск завершается — возвращается позиция (индекс) элемента.
Если элемент не найден, переходим к следующему.
Повторяем процесс, пока: элемент не будет найден или массив не закончится (в этом случае возвращается информация об отсутствии искомого элемента).
Пример:
Массив: [3, 5, 7, 9, 11]. Искомое значение: 7.
Сравниваем 3 и 7 — не совпадают.
Сравниваем 5 и 7 — не совпадают.
Сравниваем 7 и 7 — совпадение, поиск завершён.
Результат: элемент найден на позиции 2 (счёт с нуля).
Функция временной сложности и её асимптотическая оценка
Лучший случай:
В лучшем случае искомый элемент находится на первом месте в массиве. Значит, выполняется лишь одна операция сравнения:
Средний случай:
В среднем, элемент будет найден после проверки половины массива:
Худший случай:
Искомый
элемент находится в самом конце массива
или отсутствует, нужно выполнить
операция
сравнения:
Функция пространственной сложности и её асимптотическая оценка
Пространственная
сложность
,
так как алгоритм работает напрямую с
массивом без использования дополнительных
структур данных.
График функции временной сложности для всех случаев
Бинарный поиск
(Binary Search)
Бинарный поиск — это эффективный алгоритм для поиска элемента в отсортированном массиве. Алгоритм работает по принципу "разделяй и властвуй", систематически сокращая диапазон поиска, пока элемент не будет найден или пространство поиска не станет пустым.
Описание алгоритма
Выбирается средний элемент массива.
Сравнивается искомое значение с этим элементом:
Если они равны, поиск завершён.
Если искомое значение меньше, поиск продолжается в левой половине массива. Если больше — в правой половине.
Процесс повторяется, пока элемент не будет найден или диапазон поиска не станет пустым.
Пример:
Массив
Искомый элемент: 10
Левая
граница
;
правая
граница
Начинаем с середины массива:
Средний элемент
=
Сравниваем
элементы:
,
значит увеличиваем левую границу на 1
и ищем в правой половине массива: [10, 12,
14].
Определяем
новый средний элемент
при
:
Средний элемент
=
Сравниваем
элементы:
,
значит уменьшаем правую границу на 1 и
ищем в правой половине массива: [10, 12].
Определяем
новый средний элемент
при
:
Средний элемент
=
Элемент найден.
Функция временной сложности и её асимптотическая оценка
Лучший случай:
В
лучшем случае искомый элемент находится
посередине массиве, то есть на индексе
.
Значит,
искомый элемент будет найден, как только
мы его сравним с центральным значением
массива.
Средний случай:
В
среднем,
искомый элемент будет находиться на
случайной позиции в массиве. Но поиск
элемента будет происходить по тому же
принципу, а значит, что первый элемент,
который программа сравнит с искомым,
будет находиться так же на индексе
,
и это произойдёт
за одно сравнение. Следующие сравнение
она будет выполнять для двух элементов
с индексами
и
,
- итого два сравнения. За три сравнения
программа проверит четыре элемента с
индексами
,
,
,
.
Отсюда следует, что за k
сравнений
программа проверяет
элементов.
Поиск
будет продолжаться за k
сравнений,
где k
варьируется
от 1 до
.
Сделаем
замену
и
запишем сумму:
Запишем
замену
и
представим
в виде двух сумм:
Вторая сумма:
Для первой суммы используем свойство:
Подставим 2 вместо x:
Упрощаем знаменатель:
При
максимальной границе
,
подставляем:
Упростим
выражение:
Так в массиве может не оказаться искомого элемента, количество обращений к массиву будет равно n+1, где n обращений для присутствующего элемента и 1 для отсутствующего.
Итог:
Худший случай:
Искомый элемент находится на последнем уровне делений (самый первый элемент или самый последний), либо отсутствует в массиве. Здесь, как и в среднем случае, поиск будет выполняться за k сравнений.
