ГЛАВА 11. НЕСКОЛЬКО СЛОВ ОБ АЛГОРИТМАХ

В предыдущих главах мы рассмотрели основные типы данных (классы), которые Python предоставляет программисту для работы. Теперь несколько слов отдельно скажем об алгоритмах.

Алгоритм – конечный набор шагов, который требуется для выполнения задачи, например, алгоритм заваривания чая или алгоритм похода в магазин. Каждая функция в программе и каждая программа – это реализация определенного алгоритма, написанного на языке программирования.

К примеру, нам необходимо найти позицию наименьшего элемента в следующем наборе данных: 809, 834, 477, 478, 307, 122, 96, 102, 324, 476.

Первым делом выбираем подходящий для хранения тип данных. Очевидно, что это будет список:

Усложним задачу и попытаемся найти позицию двух наименьших элементов в не отсортированном списке.

Какие возможны алгоритмы решения?

  1. Поиск, удаление, поиск. Поиск индекса минимального элемента в списке, удаление его, снова поиск минимального, возвращаем удаленный элемент в список.
  2. Сортировка, поиск минимальных, определение индексов.

Перебор всего списка. Сравниваем каждый элемент по порядку, получаем два наименьших значения, обновляем значения, если найдены наименьшие

Рассмотрим каждый из перечисленных алгоритмов.

  1. Поиск, удаление, поиск: поиск индекса минимального элемента в списке, удаление его, снова поиск минимального, возвращаем удаленный элемент в список.

Начнем:

Удаляем из списка найденный минимальный элемент. При этом индексы в обновленном списке смещаются:

Возвращаем удаленный (первый минимальный) элемент обратно в список:

Не забываем о смещении индексов после удаления первого минимального элемента: индекс второго минимального элемента равен индексу первого минимального элемента, поэтому увеличим индекс второго минимального на 1.

Функция, реализующая данный алгоритм имеет вид:

2 Сортировка, поиск минимальных, определение индексов

Реализация второго алгоритма интуитивно понятна, поэтому приведу только исходный текст функции:

3. Перебор всего списка: сравниваем каждый элемент по порядку, получаем два наименьших значения, обновляем значения, если найдены наименьшие.

Третий алгоритм наиболее сложный из перечисленных выше, поэтому остановимся
на нем подробнее.

В отличие от человека, который может охватить взглядом сразу весь список и моментально сказать, какой из элементов является минимальным, компьютер не обладает подобным интеллектом. Машина просматривает элементы по одному, последовательно перебирая и сравнивая элементы.

На первом шаге просматриваем первые два элемента списка:

Сравниваем 809 и 834 и определяем наименьший из них, чтобы задать начальные значения min1 и min2, где будут храниться индексы первого минимального и второго минимального элементов соответственно

Затем перебираем элементы, начиная со 2-ого индекса до окончания списка:

Определили, что 809 – первый минимальный, а 834 – второй минимальный элемент из двух первых встретившихся значений списка.

Просматриваем следующий элемент списка (477):

Элемент 477 оказался меньше всех (условно назовем это «первым вариантом»):

Поэтому обновляем содержимое переменных min1 и min2, т.к. нашли новый наименьший элемент:

Рассматриваем следующий элемент списка (478):

Он оказался между двумя минимальными элементами (условно назовем это «вторым вариантом»):

Снова обновляем минимальные элементы (теперь обновился только min2)

И т.д. пока не дойдем до конца списка:

Исходный текст функции, реализующий предложенный алгоритм: