Алгоритмы для поиска
Линейный поиск
Алгоритм ищет элемент в заданной структуре данных, пока не достигнет конца структуры.
Временная сложность - O(N).
1 | public static int linearSearch(int arr[], int elementToSearch) { |
Двоичный поиск
Алгоритм делит входную коллекцию на равные половины, и с каждой итерацией сравнивает целевой элемент с элементом в середине. Поиск заканчивается при нахождении элемента. Иначе продолжаем искать элемент, разделяя и выбирая соответствующий раздел массива. Целевой элемент сравнивается со средним.
Временная сложность - O(log (N)).
1 | public static int binarySearch(int arr[], int elementToSearch) { |
Алгоритм Кнута – Морриса – Пратта
Cначала компилируется заданный шаблон. Компилируя шаблон, мы пытаемся найти префикс и суффикс строки шаблона. Это поможет в случае несоответствия – не придётся искать следующее совпадение с начального индекса.
Вместо этого мы пропускаем часть текстовой строки, которую уже сравнили, и начинаем сравнивать следующую. Необходимая часть определяется по префиксу и суффиксу, поэтому известно, какая часть уже прошла проверку и может быть безопасно пропущена.
Временная сложность - O (M + N)
Поиск прыжками
От двоичного поиска этот алгоритм отличает движение исключительно вперёд.
Прыгаем вперёд на интервал sqrt(arraylength), пока не достигнем элемента большего, чем текущий элемент или конца массива. При каждом прыжке записывается предыдущий шаг.
Прыжки прекращаются, когда найден элемент больше искомого. Затем запускаем линейный поиск между предыдущим и текущим шагами.
Временная сложность - O(sqrt (N))
Интерполяционный поиск
При равномерно распределенных данных местонахождение элемента определяется точнее. Тут и вскрывается отличие алгоритма от бинарного поиска, где мы пытаемся найти элемент в середине массива.
Для поиска элементов в массиве алгоритм использует формулы интерполяции. Эффективнее применять эти формула для больших массивов. В противном случае алгоритм работает как линейный поиск.
Временная сложность - O(log log N).
Экспоненциальный поиск
Пытаемся найти сравнительно меньший диапазон и применяем на нем двоичный алгоритм для поиска элемента.
Для работы алгоритма коллекция должна быть отсортирована.