Найти тему
programmer's notes (python and more)

Программирование на языке Python. Для начинающих. Поиск максимума (минимума)

Поиск максимума в программах на Python

Это статья для начинающих, хотя может и для тех, уже начал программировать, что-то найдётся.

Если у вас есть массив

ls = [4, 2, 5, 4, 8, 1, 5, 3, 4, 9, 1, 2]

то поиск максимального/минимального элемента очень прост max(ls)/min(ls). Хотя интересней ведь всё ручками делать. Или я не прав? Тут попалась мне книжка в Инете по алгоритмам на Python. Я вообще собираю книжки по алгоритмам. Ну и покупаю её. И какого же было моё разочарование. Нет там алгоритмов, а есть алгоритмы использования библиотек с алгоритмами. Ну в общем, ни о чём, в моём понимании. Хотя кому-то и интересно, может быть.

Ну дак вот. Стандартный поиск очень прост. Назначается временный максимум (пусть это переменная m) и при проходе по массиву происходит сравнение элементов с временным максимум. Если элемент больше временного максимума, то это значение присваивается переменной m. Ну в общем всё банально (см. программу ниже).

Рисунок 1. Поиск максимального элемента в массиве. Текст программы ниже по ссылке
Рисунок 1. Поиск максимального элемента в массиве. Текст программы ниже по ссылке
primer338.py

Можно, конечно и так, по-питоновски

#!/usr/bin/python3
ls = [4, 2, 5, 4, 8, 1, 5, 3, 4, 9, 1, 2]
m =  ls[0]
[m:=t for t in ls if t > m]
print(m)

Впрочем, нет никакого выигрыша, просто греет нас мысль, что мы как-то необычно записали один и тот же алгоритм.

Конечно, можно и так

print(sorted(ls)[-1])

Красиво, да? После сортировки, последний элемент как раз тот самый, максимальный. Список, кстати, не меняется.

Ну собственно это и всё, скажете вы. Ну почему же, можно ведь и так

Рисунок 2. Поиск максимального элемента с вложенными циклами. Текст программы см. ниже по ссылке
Рисунок 2. Поиск максимального элемента с вложенными циклами. Текст программы см. ниже по ссылке
primer339.py

Стоит ли так извращаться, - скажете вы. Ну как вам сказать. Алгоритм интересен тем, что мы сразу получаем индекс одного из максимальных элементов. И здесь нет переприсваивания для переменной с временным максимумом. Алгоритм я не буду описывать, так как он не сложен. По сути временным максимум здесь является элемент ls[i].

Мы, однако, не осветили все вопросы. Типичной задачей является: найти все максимальные элементы массива. Тут нет ничего сложного. Можно, например, найти максимум с помощью max(ls), а потом пройтись в цикле по массиву и найти все совпадения. А вот нельзя это сделать сразу в одном проходе?

Прошу

Рисунок 3. Поиск индексов всех максимальных элементов списка. Текст программы см. ниже по ссылке
Рисунок 3. Поиск индексов всех максимальных элементов списка. Текст программы см. ниже по ссылке
primer340.py

Вместо временного максимума, как скалярной переменной, взят список временных максимумов.

Конечно, задач на максимальные значения в списке (массиве) много. Ну вот например такая:

Найти три максимальных значения в данном списке.

Заметьте, не три максимальных элемента, которые, естественно, равны друг другу (см. предыдущий пример), а три максимальных значения. Например

[2, 3, 4, 1, 6, 7, 5, 6, 5, 6]

Здесь три максимальных значения: 5, 6, 7. Но порешайте сами, интересно же.

Ну, пока всё!

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

Ищите и обрящете
Ищите и обрящете