Комбинаторика Python: перестановки, сочетания, подмножества или фильтр

← Все подборки материалов

Разработка · 4 материала

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

4 материала по задачеПерейти к инструкциям ↓
В этой подборке

Материалы подборки

Выберите инструкцию под свою задачу. Ниже — подробный разбор выбора и проверки результата.

Если важен только подсчёт, сначала проверьте формулу на маленьком примере. Если важен состав, сравнивайте отдельные результаты, а не только общее число.

Четыре задачи, которые легко перепутать

Вопрос Что выбираем Пример для разных А, Б, В
Как упорядочить все элементы? Перестановки Шесть порядков: АБВ и другие
Какие пары можно выбрать без учёта порядка? Сочетания АБ, АВ, БВ — три группы
Какие наборы возможны вообще? Все подмножества Восемь наборов, включая пустой и полный
Какие элементы подходят под условие? Фильтрацию Один отобранный набор

Проверка порядка — первый разворот дерева выбора. Если АБ и БА означают разные результаты, порядок важен. Если это одна и та же команда из двух участников, порядок не нужен. Следующий вопрос — размер: ровно два элемента или любое количество. Эти два решения определяют смысл результата ещё до выбора функции Python.

Отдельно проверьте исходные данные. В примере А, Б и В различны. Если вход содержит повторяющиеся значения, одинаковые напечатанные результаты могут соответствовать разным позициям. Заранее решите, различаете ли вы объекты по положению, идентификатору или только по значению. Не удаляйте повторы автоматически, если они обозначают разных участников задачи.

Количество не равно списку результатов

Для множества из n различных элементов число всех подмножеств равно 2 в степени n. Если нужен только этот ответ, необязательно создавать каждый набор. Если затем требуется проверять каждую группу по отдельному условию, перечисление может быть частью задачи, но его объём стоит оценить заранее.

Фильтрация тоже не строит семейство наборов. Например, из чисел выбираются все значения больше порога — получается один результат. Если нужно найти все группы, сумма которых удовлетворяет условию, это уже перебор групп с последующей проверкой. Не подменяйте такую задачу фильтром отдельных элементов.

Как проверить решение

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

Начинайте с маленького примера, который можно проверить полностью. Если программа выдаёт ожидаемое количество, дополнительно сравните состав: правильное число результатов не исключает дубли и пропуски. После проверки смысла операции переходите к более крупным данным и оценке объёма работы.