Конструирование комбинаторных объектов и их подсчёт — различия между версиями
Mervap (обсуждение | вклад) (New image + fix) |
Mervap (обсуждение | вклад) м (Орфография) |
||
Строка 3: | Строка 3: | ||
{{Утверждение | {{Утверждение | ||
|statement= | |statement= | ||
− | Пусть <tex dpi="130">A=\{a_{1},a_{2}, \ldots ,a_{z}\}</tex> {{---}} множество из различных объектов, <tex dpi="130">S=Seq(A)</tex> {{---}} множество всех последовательностей из элементов <tex dpi="130">A</tex>, <tex dpi="130">W=\{w_{1},w_{2}, \ldots ,w_{m}\}</tex> {{---}} количество объектов веса от <tex dpi="130">1</tex> до <tex dpi="130">m</tex>. Мы считаем что нет объектов веса <tex dpi="130"">0</tex>, так как в противном случае существует бесконечное количество последовательностей любого веса. Тогда, '''количество последовательностей''' веса <tex dpi="130">n</tex> можно вычислить как <tex dpi="150">S_{n}=\sum_{i=1}^{n} w_{i} S_{n-i}</tex>. Причем <tex dpi="150"">S_{0} = 1</tex>, так как есть единственный способ составить пустую последовательность. | + | Пусть <tex dpi="130">A=\{a_{1},a_{2}, \ldots ,a_{z}\}</tex> {{---}} множество из различных объектов, <tex dpi="130">S=Seq(A)</tex> {{---}} множество всех последовательностей из элементов <tex dpi="130">A</tex>, <tex dpi="130">W=\{w_{1},w_{2}, \ldots ,w_{m}\}</tex> {{---}} количество объектов веса от <tex dpi="130">1</tex> до <tex dpi="130">m</tex>. Мы считаем, что нет объектов веса <tex dpi="130"">0</tex>, так как в противном случае существует бесконечное количество последовательностей любого веса. Тогда, '''количество последовательностей''' веса <tex dpi="130">n</tex> можно вычислить как <tex dpi="150">S_{n}=\sum_{i=1}^{n} w_{i} S_{n-i}</tex>. Причем <tex dpi="150"">S_{0} = 1</tex>, так как есть единственный способ составить пустую последовательность. |
|proof=Докажем по индукции. | |proof=Докажем по индукции. | ||
'''База <tex dpi="130"">n = 1</tex>'''. | '''База <tex dpi="130"">n = 1</tex>'''. | ||
− | :<tex dpi="130"">S_{1}=w_{1} S_{0}=w_{1}</tex>, что верно так как единственный способ составить последовательность веса <tex dpi="130"">1</tex> это взять любой элемент веса <tex dpi="130"">1</tex>. | + | :<tex dpi="130"">S_{1}=w_{1} S_{0}=w_{1}</tex>, что верно, так как единственный способ составить последовательность веса <tex dpi="130"">1</tex> {{---}} это взять любой элемент веса <tex dpi="130"">1</tex>. |
'''Переход'''. | '''Переход'''. | ||
− | :Пусть для <tex dpi="130"">j < n</tex> верно. Докажем для <tex dpi="130"">n</tex>. Возьмем произвольный элемент из <tex dpi="130"">A</tex> веса <tex dpi="130"">i \leqslant n</tex>, и допишем его к последовательности элементов веса <tex dpi="130"">n-i</tex>. Образуется новая последовательность веса <tex dpi="130"">n</tex>. Причем никакая последовательность не будет учтена дважды, так как | + | :Пусть для <tex dpi="130"">j < n</tex> верно. Докажем для <tex dpi="130"">n</tex>. Возьмем произвольный элемент из <tex dpi="130"">A</tex> веса <tex dpi="130"">i \leqslant n</tex>, и допишем его к последовательности элементов веса <tex dpi="130"">n-i</tex>. Образуется новая последовательность веса <tex dpi="130"">n</tex>. Причем никакая последовательность не будет учтена дважды, так как прежде не было последовательностей веса <tex dpi="130"">n</tex> и ни к какой последовательности меньшего веса мы не добавляем один и тот же элемент дважды |
− | }} | + | l}} |
===Подсчет битовых векторов длины <tex dpi="150">n</tex>=== | ===Подсчет битовых векторов длины <tex dpi="150">n</tex>=== | ||
Строка 24: | Строка 24: | ||
===Подсчет подвешенных непомеченных деревьев с порядком на детях=== | ===Подсчет подвешенных непомеченных деревьев с порядком на детях=== | ||
− | Пусть <tex dpi="130">T_{n}</tex> {{---}} количество таких деревьев с <tex dpi="130">n</tex> вершинами, <tex dpi="130">T_{0} = 1</tex>. <tex dpi="130">S=Seq(A)</tex> {{---}} множество всех последовательностей из данных деревьев. <tex dpi="130">S_{n}</tex> {{---}} количество последовательностей с суммарным количество вершин <tex dpi="130">n</tex>. Чтобы получить дерево из <tex dpi="130">n</tex> вершин достаточно взять <tex dpi="130">1</tex> вершину, и подвесить к ней последовательность деревьев с суммарным количеством вершин <tex dpi="130">n-1</tex>. Тогда: | + | Пусть <tex dpi="130">T_{n}</tex> {{---}} количество таких деревьев с <tex dpi="130">n</tex> вершинами, <tex dpi="130">T_{0} = 1</tex>. <tex dpi="130">S=Seq(A)</tex> {{---}} множество всех последовательностей из данных деревьев. <tex dpi="130">S_{n}</tex> {{---}} количество последовательностей с суммарным количество вершин <tex dpi="130">n</tex>. Чтобы получить дерево из <tex dpi="130">n</tex> вершин, достаточно взять <tex dpi="130">1</tex> вершину, и подвесить к ней последовательность деревьев с суммарным количеством вершин <tex dpi="130">n-1</tex>. Тогда: |
:<tex dpi="150">T_{n}=S_{n-1}</tex>. | :<tex dpi="150">T_{n}=S_{n-1}</tex>. | ||
:<tex dpi="150">S_{n}=\sum_{i=1}^{n} T_{i} S_{n-i}=\sum_{i=1}^{n} S_{i-1} S_{n-i}=\sum_{i=0}^{n-1} S_{i} S_{n-i-1}=C_{n}</tex>, где <tex dpi="150">C_{n}</tex> {{---}} <tex dpi="150">n</tex>-ое [[Числа Каталана|число Каталана]]. | :<tex dpi="150">S_{n}=\sum_{i=1}^{n} T_{i} S_{n-i}=\sum_{i=1}^{n} S_{i-1} S_{n-i}=\sum_{i=0}^{n-1} S_{i} S_{n-i-1}=C_{n}</tex>, где <tex dpi="150">C_{n}</tex> {{---}} <tex dpi="150">n</tex>-ое [[Числа Каталана|число Каталана]]. | ||
Строка 35: | Строка 35: | ||
{{Утверждение | {{Утверждение | ||
|statement= | |statement= | ||
− | Пусть <tex dpi="130">A=\{a_{1},a_{2}, \ldots ,a_{z}\}</tex> {{---}} множество из различных объектов, <tex dpi="130">P=PSet(A)</tex> {{---}} множество всех множеств составленных из элементов <tex dpi="130">A</tex>, <tex dpi="130">W=\{w_{1},w_{2}, \ldots ,w_{k}\}</tex> {{---}} количество объектов веса <tex dpi="130">\{1 \ldots k\}</tex>. Тогда '''количество множеств''' суммарного веса <tex dpi="130">n</tex> можно вычислить как <tex dpi="150">P_{n}=p_{n, n}</tex>, где <tex dpi="150">p_{n, k}=\sum_{i=0}^{\lfloor \frac{n}{k} \rfloor} \binom{w_{k}}{i} p_{n-ik, k-1}</tex> {{---}} количество таких множеств, | + | Пусть <tex dpi="130">A=\{a_{1},a_{2}, \ldots ,a_{z}\}</tex> {{---}} множество из различных объектов, <tex dpi="130">P=PSet(A)</tex> {{---}} множество всех множеств, составленных из элементов <tex dpi="130">A</tex>, <tex dpi="130">W=\{w_{1},w_{2}, \ldots ,w_{k}\}</tex> {{---}} количество объектов веса <tex dpi="130">\{1 \ldots k\}</tex>. Тогда '''количество множеств''' суммарного веса <tex dpi="130">n</tex> можно вычислить как <tex dpi="150">P_{n}=p_{n, n}</tex>, где <tex dpi="150">p_{n, k}=\sum_{i=0}^{\lfloor \frac{n}{k} \rfloor} \binom{w_{k}}{i} p_{n-ik, k-1}</tex> {{---}} количество таких множеств, которые содержат объекты, вес которых не больше чем <tex dpi="130">k</tex>. |
}} | }} | ||
Строка 54: | Строка 54: | ||
===Количество разбиений на слагаемые=== | ===Количество разбиений на слагаемые=== | ||
Пусть <tex dpi="130">A=\mathbb{N}</tex>, <tex dpi="130">P=PSet(A)</tex> {{---}} множество всех [[Нахождение количества разбиений числа на слагаемые|разбиений на слагаемые]], <tex dpi="130">W=\{1 \ldots 1\}</tex>, <tex dpi="130">w_{0} = 1</tex>. Тогда, | Пусть <tex dpi="130">A=\mathbb{N}</tex>, <tex dpi="130">P=PSet(A)</tex> {{---}} множество всех [[Нахождение количества разбиений числа на слагаемые|разбиений на слагаемые]], <tex dpi="130">W=\{1 \ldots 1\}</tex>, <tex dpi="130">w_{0} = 1</tex>. Тогда, | ||
− | :<tex dpi="150">P_{n}=p_{n, n}</tex>, где <tex tex dpi="150">p_{n, k}=\sum_{i=0}^{\lfloor \frac{n}{k} \rfloor} p_{n-ik, k-1} = p_{n, k-1} + p_{n - k, k}</tex>, что, как | + | :<tex dpi="150">P_{n}=p_{n, n}</tex>, где <tex tex dpi="150">p_{n, k}=\sum_{i=0}^{\lfloor \frac{n}{k} \rfloor} p_{n-ik, k-1} = p_{n, k-1} + p_{n - k, k}</tex>, что, как несложно заметить, соответствует формуле, полученной методом [[Нахождение количества разбиений числа на слагаемые#Алгоритм за O(N^2)|динамического программирования]]. |
Строка 60: | Строка 60: | ||
{{Утверждение | {{Утверждение | ||
|statement= | |statement= | ||
− | Пусть <tex dpi="130">A=\{a_{1},a_{2}, \ldots ,a_{z}\}</tex> {{---}} множество из различных объектов, <tex dpi="130">M=MSet(A)</tex> {{---}} множество всех мультимножеств <ref>[[wikipedia:Multiset|Wikipedia {{---}} Мультимножества]]</ref> из элементов <tex dpi="130">A</tex>, <tex dpi="130">W=\{w_{1},w_{2}, \ldots ,w_{k}\}</tex> {{---}} количество объектов веса <tex dpi="130">\{1 \ldots k\}</tex>. Тогда '''количество мультимножеств''' из объектов суммарного веса <tex dpi="130">n</tex> можно вычислить как <tex dpi="150">M_{n}=m_{n, n}</tex>, где <tex dpi="150">m_{n, k}=\sum_{i=0}^{\lfloor \frac{n}{k} \rfloor} \binom{w_{k}+i-1}{i} m_{n-ik, k-1}</tex> {{---}} количество таких мультимножеств, | + | Пусть <tex dpi="130">A=\{a_{1},a_{2}, \ldots ,a_{z}\}</tex> {{---}} множество из различных объектов, <tex dpi="130">M=MSet(A)</tex> {{---}} множество всех мультимножеств <ref>[[wikipedia:Multiset|Wikipedia {{---}} Мультимножества]]</ref> из элементов <tex dpi="130">A</tex>, <tex dpi="130">W=\{w_{1},w_{2}, \ldots ,w_{k}\}</tex> {{---}} количество объектов веса <tex dpi="130">\{1 \ldots k\}</tex>. Тогда '''количество мультимножеств''' из объектов суммарного веса <tex dpi="130">n</tex> можно вычислить как <tex dpi="150">M_{n}=m_{n, n}</tex>, где <tex dpi="150">m_{n, k}=\sum_{i=0}^{\lfloor \frac{n}{k} \rfloor} \binom{w_{k}+i-1}{i} m_{n-ik, k-1}</tex> {{---}} количество таких мультимножеств, которые содержат объекты, вес которых не больше чем <tex dpi="130">k</tex>. |
}} | }} | ||
Строка 79: | Строка 79: | ||
===Подсчет подвешенных непомеченных деревьев без порядка на детях=== | ===Подсчет подвешенных непомеченных деревьев без порядка на детях=== | ||
− | Пусть <tex dpi="130">T_{n}</tex> {{---}} количество таких деревьев с <tex dpi="130">n</tex> вершинами, <tex dpi="130">T_{0} = 1</tex>. <tex dpi="130">F=MSet(T)</tex> {{---}} множество всех лесов из данных деревьев, так как лес можно интерпретировать как мультимножество из деревьев. <tex dpi="130">F_{n}=f_{n,n}</tex> {{---}} количество лесов с суммарным количество вершин <tex dpi="130">n</tex>. <tex dpi="130">f_{n, k}</tex> {{---}} количество таких лесов из <tex dpi="130">n</tex> вершин, что деревья в них содержат не более чем <tex dpi="130">k</tex> вершин. Чтобы получить дерево из <tex dpi="130">n</tex> вершин достаточно взять <tex dpi="130">1</tex> вершину и подвесить к ней лес деревьев с суммарным количеством вершин <tex dpi="130">n-1</tex>. Тогда: | + | Пусть <tex dpi="130">T_{n}</tex> {{---}} количество таких деревьев с <tex dpi="130">n</tex> вершинами, <tex dpi="130">T_{0} = 1</tex>. <tex dpi="130">F=MSet(T)</tex> {{---}} множество всех лесов из данных деревьев, так как лес можно интерпретировать как мультимножество из деревьев. <tex dpi="130">F_{n}=f_{n,n}</tex> {{---}} количество лесов с суммарным количество вершин <tex dpi="130">n</tex>. <tex dpi="130">f_{n, k}</tex> {{---}} количество таких лесов из <tex dpi="130">n</tex> вершин, что деревья в них содержат не более чем <tex dpi="130">k</tex> вершин. Чтобы получить дерево из <tex dpi="130">n</tex> вершин, достаточно взять <tex dpi="130">1</tex> вершину и подвесить к ней лес деревьев с суммарным количеством вершин <tex dpi="130">n-1</tex>. Тогда: |
:<tex dpi="150">T_{n}=F_{n-1}</tex>. | :<tex dpi="150">T_{n}=F_{n-1}</tex>. | ||
:<tex dpi="150">F_{n}=f_{n, n}</tex>. | :<tex dpi="150">F_{n}=f_{n, n}</tex>. | ||
Строка 127: | Строка 127: | ||
===Задача об ожерельях=== | ===Задача об ожерельях=== | ||
− | Решим данным способом [[Задача об ожерельях|задачу об ожерельях]]. Пусть необходимый вес <tex dpi="130">n</tex> это количество бусинок, а <tex dpi="130">k</tex> {{---}} количество цветов. | + | Решим данным способом [[Задача об ожерельях|задачу об ожерельях]]. Пусть необходимый вес <tex dpi="130">n</tex> {{---}} это количество бусинок, а <tex dpi="130">k</tex> {{---}} количество цветов. Причем каждая бусинка весит <tex dpi="130">1</tex>. То есть <tex dpi="130">W=\{k, 0 \ldots 0\}</tex>. |
− | <tex dpi="130">C_{n}=\sum_{s=1}^{n}c_{n,s}=c_{n,n}</tex> так как невозможно набрать вес <tex dpi="130">n</tex> менее чем <tex dpi="130">n</tex> бусинами при весе бусин <tex dpi="130">1</tex>. | + | <tex dpi="130">C_{n}=\sum_{s=1}^{n}c_{n,s}=c_{n,n}</tex> так как невозможно набрать вес <tex dpi="130">n</tex> менее, чем <tex dpi="130">n</tex> бусинами при весе бусин <tex dpi="130">1</tex>. |
<tex dpi="130">c_{n,n}=\sum_{i=0}^{n-1}\dfrac{|St(\vec{i})|}{n}=\dfrac{1}{n}\sum_{i=0}^{s-1}|St(\vec{i})|=\dfrac{1}{n}\sum_{i=0}^{s-1}b_{\mathrm{gcd}(n,i),\mathrm{gcd}(n,i)}</tex>. Поскольку все бусины имеют одинаковый вес <tex dpi="130">1</tex>, то <tex dpi="130">b_{n,k} \neq 0</tex> | <tex dpi="130">c_{n,n}=\sum_{i=0}^{n-1}\dfrac{|St(\vec{i})|}{n}=\dfrac{1}{n}\sum_{i=0}^{s-1}|St(\vec{i})|=\dfrac{1}{n}\sum_{i=0}^{s-1}b_{\mathrm{gcd}(n,i),\mathrm{gcd}(n,i)}</tex>. Поскольку все бусины имеют одинаковый вес <tex dpi="130">1</tex>, то <tex dpi="130">b_{n,k} \neq 0</tex> |
Версия 19:47, 29 декабря 2017
Содержание
Последовательности (Seq)
Утверждение: |
Пусть — множество из различных объектов, — множество всех последовательностей из элементов , — количество объектов веса от до . Мы считаем, что нет объектов веса , так как в противном случае существует бесконечное количество последовательностей любого веса. Тогда, количество последовательностей веса можно вычислить как . Причем , так как есть единственный способ составить пустую последовательность. |
Докажем по индукции. База .
Переход.
|
Подсчет битовых векторов длины
Пусть битовых векторов, .
, — множество всехТогда,
.Подсчет Seq из маленьких и больших элементов
Пусть
, , — множество всех последовательностей из маленьких и больших элементов, , .Тогда, [1].
, где — -ое число ФибоначчиПодсчет подвешенных непомеченных деревьев с порядком на детях
Пусть
— количество таких деревьев с вершинами, . — множество всех последовательностей из данных деревьев. — количество последовательностей с суммарным количество вершин . Чтобы получить дерево из вершин, достаточно взять вершину, и подвесить к ней последовательность деревьев с суммарным количеством вершин . Тогда:- .
- число Каталана. , где — -ое
Множества (PSet)
Утверждение: |
Пусть — множество из различных объектов, — множество всех множеств, составленных из элементов , — количество объектов веса . Тогда количество множеств суммарного веса можно вычислить как , где — количество таких множеств, которые содержат объекты, вес которых не больше чем . |
Количество PSet из элементов 0 и 1
Пусть
, — множество всех множеств из , , . Тогда , где .- .
- .
- .
- .
- Для , .
Количество разбиений на слагаемые
Пусть разбиений на слагаемые, , . Тогда,
, — множество всех- динамического программирования. , где , что, как несложно заметить, соответствует формуле, полученной методом
Мультимножества (MSet)
Утверждение: |
Пусть [2] из элементов , — количество объектов веса . Тогда количество мультимножеств из объектов суммарного веса можно вычислить как , где — количество таких мультимножеств, которые содержат объекты, вес которых не больше чем . — множество из различных объектов, — множество всех мультимножеств |
Количество MSet из элементов 0 и 1
Пусть
, — множество всех множеств из , , .- Тогда, , где
- .
- .
- .
- .
- .
Подсчет подвешенных непомеченных деревьев без порядка на детях
Пусть
— количество таких деревьев с вершинами, . — множество всех лесов из данных деревьев, так как лес можно интерпретировать как мультимножество из деревьев. — количество лесов с суммарным количество вершин . — количество таких лесов из вершин, что деревья в них содержат не более чем вершин. Чтобы получить дерево из вершин, достаточно взять вершину и подвесить к ней лес деревьев с суммарным количеством вершин . Тогда:- .
- .
- .
Количество таких деревьев с [3]
вершинами образуют последовательность
Пары (Pair)
Утверждение: |
Пусть , — множества из различных объектов, — множество всех пар объектов, составленных из элементов и . — количество объектов веса , составленных из элементов , а — соответственно для . Тогда количество пар из объектов суммарного веса можно вычислить как . |
Количество подвешенных неполных двоичных деревьев
Пусть
— количество таких деревьев с вершинами, . — множество всех пар из данных деревьев. Чтобы получить двоичное дерево из вершин, достаточно взять вершину и подвесить к ней левого и правого сына с суммарным количеством вершин . Тогда:- число Каталана. , где — -ое
Циклы (Cycle)
Утверждение: |
Пусть [4] из элементов , — количество объектов веса .
— множество из различных объектов, — множество всех циклов Тогда количество циклов веса По можно вычислить как , где — количество циклов веса длины . лемме Бёрнсайда , где — количество стабилизаторов для циклического сдвига на . |
Найдем
в общем случае.Пусть наибольший общий делитель. Заметим, что в -ой перестановке на -ой позиции стоит элемент . Также, заметим, что элемент переходит в элемент , где . Из этого следует, что длина цикла для -ой перестановки равна , где — наименьшее общее кратное.
—Также заметим, что если вес
нельзя равномерно распределить по всей длине цикла, то стабилизатор равен .
Где
— число способов упорядочить набор из элементов суммарного веса и, причем .
Задача об ожерельях
Решим данным способом задачу об ожерельях. Пусть необходимый вес — это количество бусинок, а — количество цветов. Причем каждая бусинка весит . То есть .
так как невозможно набрать вес менее, чем бусинами при весе бусин .
. Поскольку все бусины имеют одинаковый вес , то
В итоге,
.Производящие функции
Для анализа свойств таких больших групп часто применяют метод производящих функций. Рассмотренные классы имеют следующие производящие функции:
См.также
- Лемма Бёрнсайда и Теорема Пойа
- Числа Каталана
- Генерация комбинаторных объектов в лексикографическом порядке