Визуализация
Искомое: В случайном месте
Легенда цветов
Как работает линейный поиск
Идея алгоритма. Самый простой и естественный способ найти элемент в массиве: берем первый элемент и сравниваем с искомым. Если не совпал - берем следующий. И так до тех пор, пока не найдем нужный или пока не закончится массив.
Главное преимущество. Линейный поиск не требует предварительной подготовки данных - массив может быть совершенно неупорядоченным (в отличие от двоичного поиска, которому нужен отсортированный массив).
Синонимы названия. Этот алгоритм также часто называют наивным поиском или последовательным поиском.
Сложность алгоритма
Сложность - это оценка того, как быстро растет потребление ресурса при росте длины массива n. Оценки записывают через O-нотацию - у нас есть отдельная анимация о том, как читать такие записи.
По времени
Показывает, как растет число операций (здесь это сравнения элементов) при росте n. Линейный поиск работает за O(n) - это значительно медленнее, чем двоичный поиск O(log n).
| Случай | Время | Комментарий |
|---|---|---|
| Лучший (элемент в начале) | O(1) | Нашли сразу же на первом шаге |
| Средний | O(n) | В среднем придется просмотреть половину массива (n/2 сравнений) |
| Худший (элемента нет или он в конце) | O(n) | Придется проверить все n элементов |
По памяти
Показывает, сколько дополнительной памяти нужно алгоритму помимо самого массива.
| Характеристика | Оценка | Комментарий |
|---|---|---|
| Дополнительная память | O(1) | Хватает одной переменной i для хранения текущего индекса |
Требования к данным
| Характеристика | Оценка | Комментарий |
|---|---|---|
| Требует сортировки? | Нет | Работает на любых данных, в том числе неотсортированных (в отличие от двоичного поиска) |
Примеры реализации линейного поиска (Linear Search)
Код на C
// Возвращает индекс найденного элемента или -1, если элемента нет
int linear_search(int arr[], int n, int target) {
// Проходим по всему массиву слева направо
for (int i = 0; i < n; i++) {
// Если элемент совпал с искомым - возвращаем его индекс
if (arr[i] == target) {
return i;
}
}
// Просмотрели весь массив, элемент не найден
return -1;
}
Код на Python
# Возвращает индекс найденного элемента или -1, если элемента нет
def linear_search(arr, target):
n = len(arr)
# Проходим по всему массиву
for i in range(n):
# Если нашли совпадение - сразу возвращаем индекс
if arr[i] == target:
return i
# Если цикл завершился и мы ничего не вернули,
# значит элемента в массиве нет
return -1
Код на JavaScript
// Возвращает индекс найденного элемента или -1, если элемента нет
function linearSearch(arr, target) {
const n = arr.length;
// Проходим по всему массиву
for (let i = 0; i < n; i++) {
// Если нашли нужное значение, прекращаем поиск и отдаем индекс
if (arr[i] === target) {
return i;
}
}
// Элемент не найден
return -1;
}