Линейный поиск / Linear search на Python
Представим себе обыкновенную ситуацию: у нас есть список, содержащий в себе множество элементов, например, строки.
Нам требуется найти индекс какого-нибудь элемента, и мы ничего не знаем о порядке элементов в списке.
Для начала предлагаю написать свое решение, а потом сравнить. Так будет интереснее.
В качестве примера возьмем часть ряда клавиш с клавиатуры.
Создадим функцию, которая будет принимать список и искомое значение, индекс которого нужно будет вернуть.
Условимся, что будем двигаться по списку слева-направо, как и в реальной жизни, если бы искали книги на полке.
Самый простой алгоритм (и самый неправильный), который приходит в голову - это создать переменную result, которой заранее присвоим значение None, а далее в цикле for пройтись по всем индексам и сравнить элементы с искомым значением (lst[index] = x), и если данное условие выполняется, то result = index.
Процедура всегда возвращает правильный ответ, так почему она неэффективна?
Как многие догадались, поиск в массиве будет продолжаться, даже после нахождения искомого индекса. Если запустим скрипт, то output будет следующим:
Не самое элегентное решение, тем более, если элементов в списке будет очень много.
Теперь сделаем так, чтобы поиск прекращался, как только мы найдем значение x.
Если мы находим x, то цикл сразу прерывается, если же мы ничего не находим, то получаем None:
Но смущает то, что процедура выполняет по 2 проверки на каждой итерации - не вышли ли мы за границы списка и проверка равенства.
Опять же вернемся к книжным полкам, вы каждый раз смотрите на книгу, проверяете ее название и то, не дошли ли вы до конца полки? У всех умные девайсы и читалки
Проще говоря, условие i < len(lst) из while надо бы убрать.
Поместим элемент x в конец списка и будем точно уверены, что найдем искомый индекс. Если мы найдем “заменитель” (его еще называют ограничителем или барьером), то x в списке нет.
Ну и в конце напишем тесты, чтобы спать спокойно. Пишите свои предложения, если я что-то пропустил.
Код можно найти здесь.
Интересно? См. Бинарный (двоичный) поиск