Сочетания: различия между версиями
СВ (обсуждение | вклад) |
СВ (обсуждение | вклад) |
||
Строка 44: | Строка 44: | ||
Правая часть равенства соответствует выбору сначала <math>l</math> элементов из <math>n</math>, | Правая часть равенства соответствует выбору сначала <math>l</math> элементов из <math>n</math>, | ||
а затем <math>k-l</math> элементов из оставшихся <math>n-l</math>. Получим те же варианты подмножеств. | а затем <math>k-l</math> элементов из оставшихся <math>n-l</math>. Получим те же варианты подмножеств. | ||
== Алгоритм перебора сочетаний == | |||
Пусть <math>x_1, x_2, ..., x_k</math> {{---}} числа из множества <math>\{1,2,...,n\}</math>, вошедшие в сочетание, причем <math>x_1 \lt x_2 \lt ... \lt x_k</math>. | |||
Пусть в начальный момент времени сочетание состоит из первых <math>k</math> чисел: <math>x_i = i, i=\overline{1,k}</math>. | |||
На каждом шаге будем просматривать вектор <math>(x_1, x_2, ..., x_k)</math>, начиная с <math>x_k</math>, и искать первую такую компоненту <math>x_i</math>, | |||
которую можно увеличить (нельзя увеличить <math>x_k</math>, если он равен <math>n</math>; <math>x_{k-1}</math>, если он равен <math>n-1</math> и так далее). | |||
Если такой компоненты не найдется, алгоритм завершает свою работу. | |||
В противном случае, пусть <math>i</math> {{---}} такое наибольшее число, что <math>x_i \lt n-k+i</math>. | |||
Увеличим <math>x_i</math> на единицу, а для всех <math>x_t, t=\overline{i+1,k}</math>, присваиваем значения <math>x_t = x_i+(t-i)</math>. | |||
Повторяем процесс нужное число раз. | |||
=== Пример === | |||
{{Пример | |||
|num=1 | |||
|definition=Рассмотрим, как работает алгоритм для <math>n=5</math> и <math>k=3</math>. | |||
# Сначала <math>x = (x_1, x_2, x_3) = (1,2,3)</math>. | |||
# Увеличиваем <math>x_3</math>: <math>x = (1,2,4)</math>. | |||
# Увеличиваем <math>x_3</math>: <math>x = (1,2,5)</math>. | |||
# <math>x_3</math> больше увеличить нельзя. Увеличиваем <math>x_2</math> и переназначаем значение <math>x_3</math>: <math>x = (1,3,4)</math>. | |||
# <math>x = (1,3,5)</math> | |||
# <math>x = (1,4,5)</math> | |||
# <math>x = (2,3,4)</math> | |||
# <math>x = (2,3,5)</math> | |||
# <math>x = (2,4,5)</math> | |||
# <math>x = (3,4,5)</math> | |||
Таким образом, мы перебрали все сочетания из 5 по 3. | |||
}} | |||
[[Категория:Комбинаторика]] | [[Категория:Комбинаторика]] |
Версия 18:03, 31 октября 2021
Не умаляя общности, можно называть сочетанием из [math]\displaystyle{ n }[/math] элементов по [math]\displaystyle{ k }[/math] неупорядоченный набор из [math]\displaystyle{ k }[/math] различных чисел, принадлежащих множеству [math]\displaystyle{ \{1, ..., n\} }[/math].
Количество различных сочетаний из [math]\displaystyle{ n }[/math] по [math]\displaystyle{ k }[/math] обозначают [math]\displaystyle{ C_n^k }[/math] или [math]\displaystyle{ \binom{n}{k} }[/math].
Действительно, каждому сочетанию из [math]\displaystyle{ n }[/math] по [math]\displaystyle{ k }[/math] соответствует [math]\displaystyle{ k! }[/math] различных размещений из [math]\displaystyle{ n }[/math] по [math]\displaystyle{ k }[/math] с различным порядком следования элементов. Тогда [math]\displaystyle{ \binom{n}{k} = \frac{A_n^k}{k!} = \frac{n!}{k!(n-k)!} }[/math].
Свойства числа сочетаний
[math]\displaystyle{ \binom{n}{k}\cdot\binom{k}{l} = \binom{n}{l}\cdot \binom{n-l}{k-l}. }[/math]
Действительно, [math]\displaystyle{ \binom{n}{k}\cdot\binom{k}{l}= \frac{n!}{k!(n-k)!}\cdot\frac{k!}{l!(k-l)!} \cdot \frac{(n-l)!}{(n-l)!}= \frac{n!}{l!(n-l)!}\cdot\frac{(n-l)!}{(k-l)!(n-k)!} = \binom{n}{l}\cdot \binom{n-l}{k-l}. }[/math]
Интуитивно формулу можно описать как разбиение множества из [math]\displaystyle{ n }[/math] элементов на три подмножества мощностей [math]\displaystyle{ l }[/math], [math]\displaystyle{ k-l }[/math], [math]\displaystyle{ n-k }[/math] соответственно. Левая часть равенства описывает выбор сначала [math]\displaystyle{ k }[/math] элементов из [math]\displaystyle{ n }[/math], а затем [math]\displaystyle{ l }[/math] элементов из выбранных [math]\displaystyle{ k }[/math]. Получим все варианты разбиения исходного множества на три подмножества указанных мощностей.
Правая часть равенства соответствует выбору сначала [math]\displaystyle{ l }[/math] элементов из [math]\displaystyle{ n }[/math], а затем [math]\displaystyle{ k-l }[/math] элементов из оставшихся [math]\displaystyle{ n-l }[/math]. Получим те же варианты подмножеств.
Алгоритм перебора сочетаний
Пусть [math]\displaystyle{ x_1, x_2, ..., x_k }[/math] — числа из множества [math]\displaystyle{ \{1,2,...,n\} }[/math], вошедшие в сочетание, причем [math]\displaystyle{ x_1 \lt x_2 \lt ... \lt x_k }[/math].
Пусть в начальный момент времени сочетание состоит из первых [math]\displaystyle{ k }[/math] чисел: [math]\displaystyle{ x_i = i, i=\overline{1,k} }[/math].
На каждом шаге будем просматривать вектор [math]\displaystyle{ (x_1, x_2, ..., x_k) }[/math], начиная с [math]\displaystyle{ x_k }[/math], и искать первую такую компоненту [math]\displaystyle{ x_i }[/math], которую можно увеличить (нельзя увеличить [math]\displaystyle{ x_k }[/math], если он равен [math]\displaystyle{ n }[/math]; [math]\displaystyle{ x_{k-1} }[/math], если он равен [math]\displaystyle{ n-1 }[/math] и так далее).
Если такой компоненты не найдется, алгоритм завершает свою работу. В противном случае, пусть [math]\displaystyle{ i }[/math] — такое наибольшее число, что [math]\displaystyle{ x_i \lt n-k+i }[/math]. Увеличим [math]\displaystyle{ x_i }[/math] на единицу, а для всех [math]\displaystyle{ x_t, t=\overline{i+1,k} }[/math], присваиваем значения [math]\displaystyle{ x_t = x_i+(t-i) }[/math]. Повторяем процесс нужное число раз.