5. Сочетания без повторений
Обратите внимание на другие наши ресурсы: Youtube | Telegram | VK | Rutube | Dzen | Boosty
Определение
Сочетания без повторений - это неупорядоченное подмножество из элементов, выбранное из различных элементов. Каждый элемент может быть выбран только один раз, и порядок элементов не имеет значения.
Формула
- - количество сочетаний без повторений из элементов, выбранных элементов.
- - факториал числа n, что означает произведение всех положительных целых чисел от до .
- - факториал числа .
- - факториал разницы между и .
Принцип работы
У нас есть набор {A, B, C, D}, и мы хотим выбрать 2 элемента из этого набора без учёта порядка.
Определение переменных:
- — общее количество элементов, из которых мы выбираем. Здесь: , так как у нас есть 4 элемента: A, B, C, D.
- — количество элементов, которые мы выбираем из общего числа nn. В этом примере: , так как нам нужно выбрать 2 элемента из 4, но порядок не важен.
Разберем все по шагам:
-
Шаг 1: Подсчёт количества сочетаний без повторений Число сочетаний из по без повторений рассчитывается по формуле:
-
Шаг 2: Подстановка значений Подставим значения и в формулу:
-
Шаг 3: Проверка результата (перечисление сочетаний) Все возможные пары, где порядок не имеет значения: AB, AC, AD, BC, BD, CD.
Всего 6 уникальных сочетаний, что подтверждает наши расчёты.
Вычислительная сложность
Вычислительная сложность , т.к. для оптимизации вычисления выбирается минимальное из или , что снижает вычислительную сложность.
Пространственная сложность
Пространственная сложность : Память фиксированная, так как вычисления и хранимые промежуточные значения не увеличиваются с ростом .
Применение
Сочетания без повторений имеют широкий спектр применений в различных областях:
-
Математика: Используются для решения комбинаторных задач и формулирования математических теорем.
-
Информатика: Применяются в алгоритмах и структурах данных для обработки комбинаторных данных, например, в задачах перебора вариантов.
-
Статистика: Применяются для анализа данных и расчета вероятностей.
Готовые функции в Python
В Python, библиотека itertools предоставляет функцию combinations(iterable, r), которая генерирует все уникальные сочетания длины r из итерируемого объекта iterable. Эта функция удобна для работы с сочетаниями без повторений и включена в стандартную библиотеку Python.
Готовые функции в C++
В C++, библиотека <algorithm> предоставляет функцию next_combination(), которая может быть использована для генерации сочетаний без повторений. Однако, эта функция не включена в стандартную библиотеку C++ и требует дополнительного кода для реализации.
Псевдокод
Функция Вычислить_Сочетания_Без_Повторений(n, k): результат <- 0 Если n >= k то: результат <- Вычислить_Факториал(n) / (Вычислить_Факториал(k) * Вычислить_Факториал(n - k)) Вернуть результат Функция Вычислить_Факториал(x): результат <- 1 Для каждого i от 1 до x: результат <- результат * i Вернуть результат
Реализация на Python
Аннотация: combinations_without_repetition - функция для вычисления количества сочетаний без повторений n - общее количество элементов k - размер сочетания result - результат вычисления количества сочетаний без повторений, вычисляется с помощью формулы
def combinations_without_repetition(n, k): if k > n or k < 0: return 0 if k > n - k: k = n - k result = 1 for i in range(1, k + 1): result *= n - i + 1 result //= i return result
Олимпиадная реализация на С++
Аннотация: n - общее количество элементов k - размер сочетания res - результат вычисления количества сочетаний без повторений num - факториал числа n denom - произведение факториалов чисел
#include <iostream> using namespace std; long long comb_without_rep(int n, int k) { long long res = 1; if (n >= k) { long long num = 1; long long denom = 1; for (int i = 1; i <= n; i++) { num *= i; } for (int i = 1; i <= k; i++) { denom *= i; } for (int i = 1; i <= (n - k); i++) { denom *= i; } res = num / denom; } return res; }
Продуктовая реализация на С++
Аннотация: factorial - функция для вычисления факториала числа x x - число, факториал которого нужно вычислить result - результат вычисления факториала combinations_without_repetition - функция для вычисления сочетаний без повторений n - общее количество элементов k - размер сочетания result - результат вычисления количества сочетаний без повторений
#include <iostream> using namespace std; long long factorial(int x) { long long result = 1; for (int i = 1; i <= x; i++) { result *= i; } return result; } long long combinations_without_repetition(int n, int k) { long long result = 0; if (n >= k) { result = factorial(n) / (factorial(k) * factorial(n - k)); } return result; }