Минимум и максимум в Python без готовых функций
Автор: Казачкин Даниил Михайлович · Обновлено
Поиск экстремума хранит лучший элемент среди уже просмотренных. Первое реальное значение становится начальным кандидатом; каждый следующий элемент сравнивается с ним и при…
Поиск экстремума хранит лучший элемент среди уже просмотренных. Первое реальное значение становится начальным кандидатом; каждый следующий элемент сравнивается с ним и при необходимости заменяет его. Такой алгоритм работает за один проход и не требует сортировки.
Кандидат из данных, а не случайное число
temperatures = [-8, -3, -11, -5]
maximum = temperatures[0]
for value in temperatures[1:]:
if value > maximum:
maximum = value
print('Самая высокая:', maximum)Результат:
Самая высокая: -3Начальное maximum = 0 дало бы неверный ответ, потому что нуля в данных нет и все температуры отрицательные. Первый элемент гарантирует, что кандидат принадлежит последовательности.
Пустая последовательность
Обращение temperatures[0] невозможно для пустого списка и вызывает IndexError. Условие задачи должно гарантировать хотя бы один элемент либо программа должна отдельно обработать отсутствие данных. Готовые функции min и max тоже не принимают пустую последовательность без значения default в подходящих сценариях.
Для минимума достаточно поменять знак сравнения на <. Если нужен индекс лучшего элемента, храните одновременно best_index и best_value. При равенстве выбор > сохраняет первое вхождение, а >= — последнее; это важная деталь условия.
Рекорд и его позиция
Для списка [4, 9, 2, 9, 5] найдите максимальное значение и индекс его первого появления без max и index. Ожидаются 9 и индекс 1. Проверьте список из одного элемента и набор отрицательных чисел. Нарисуйте трассировку кандидата после каждого сравнения. Затем измените оператор так, чтобы сохранялось последнее появление максимума, и объясните изменение результата.
Стабильность при равенстве
Ищите максимум не только числа, но и пару «балл, имя». Решите заранее, должен побеждать первый или последний участник с одинаковым баллом, и выберите оператор сравнения соответственно. Протестируйте список, где рекорд повторяется в начале и конце. Затем добавьте сохранение индекса и убедитесь, что значение и позиция обновляются вместе. Ошибка, при которой меняется только максимум, а индекс остаётся старым, легко обнаруживается таким набором. В итоге сформулируйте инвариант: сохранённая пара описывает лучший элемент среди уже просмотренной части списка.
Практикум: экстремумы среди отрицательных значений
Найдите минимум и максимум списка -8, -3, -12, -4 без встроенных функций. Инициализируйте оба первым элементом и перебирайте оставшиеся. Запишите таблицу изменения значений. Сравните с неверной инициализацией нулём и покажите, какой ответ искажается. Для пустого списка определите явное поведение до обращения к первому элементу. Затем добавьте индекс первого максимума, не меняя его при равном значении, и протестируйте повторы.
Контрольная точка
Какой инвариант верен после обработки первых k элементов? Максимум должен принадлежать обработанному префиксу и быть не меньше каждого его значения; это объясняет и начальную установку.
Частые вопросы
Почему нельзя всегда начинать максимум с очень маленького числа?
Можно использовать специальную бесконечность для числового контракта, но первый реальный элемент проще и сохраняет тип. Произвольная константа рискует оказаться больше допустимых данных и дать несуществующий ответ.