- •Анализ алгоритмов (Лекции 2000)
- •Глава 1. Модели вычислений.
- •Глава 3. Перестановки как абстрактный тип данных
- •3.1 Представление перестановок в естественной форме.
- •Var a : array [1..N] of Boolean;
- •Var I, j, k, m:1..N; a:array[1..N] of Boolean;
- •If a[I] then
- •Var I,j:1..N; s:boolean:
- •Var I,j,k:1..N: a:array[1..N] of boolean;
- •If a[I] then
- •3.2 Представление перестановок в циклической форме.
- •Procedure trsl(var f: tpe; var g: tpc);
- •Var I : 1..N; s : Boolean;
- •If a[I] then
- •Procedure u1(var f : tpe; var g : tpk);
- •Var r : real;
- •3.3 Представление перестановок в виде таблицы инверсий.
- •Var I : 0..N; s : Boolean;
- •Var I, j, k : integer;
- •Var c : array [0..N] of 0..1;
- •X : array [1..N] of real;
- •Function ч3 (var r :tpi) : Boolean;
- •Var k, I, j, s, : integer;
- •3.4 Задача о складывании карт.
- •Var I,a,b : integer;
- •Var z:integer;
- •Глава 4. Генерация перестановок
- •4.1Генерация перестановок в лексикографическом порядке.
- •Var р : array [0..N] of 0..N; { текущая перестановка}
- •Var p : array [1..N] of 1..N;
- •Генерация перестановок за минимальное число транспозиций
- •Var I,k : integer;
- •Var p:array [0..N1] of 1..N1;
- •I,j,k,t: integer;
- •Глава 5. Генерация подмножеств множества
- •5.1Генерация подмножеств в лексикографическом порядке.
- •5.2 Генерация подмножеств за счет их минимального изменения.
- •Var s : array [1..N] of 0..1;
- •I : integer;
- •Var s : array [1..N] of 0..1;
- •I,j,k,p : integer;
- •Var t : array [0..N] of 1..N1; {стек}
- •Var t : array [0..N1] of 1..N2;
- •I,p : integer;
- •5.3Генерация мультимножеств.
- •Глава 6. Генерация k-подмножеств
- •Var s : array[1..K] of 1..N;
- •I,p : integer;
- •6.1Генерация k-подмножеств заменой одного элемента.
- •Var I : integer;
- •Var I,m,h:integer;
- •Упражнение. Выполните приведенный алгоритм для деревьв
- •В режиме неполного вычисления
- •Глава 8 Теорема о сложности рекурсивных программ
- •Глава 9 Производящие функции
Глава 9 Производящие функции
При доказательстве тех или иных комбинаторных тождеств часто используется одно или одновременно два из следующих правил:
Правило суммы. Если объект А может быть выбран m способами, а объект В другими n способами, то выбор “либо А, либо В” может быть осуществлен m+n способами.
Правило произведения. Если объект А может быть выбран m способами и после каждого из таких выборов объект В в свою очередь может быть выбран n способами, то выбор “А, и В” в указанном порядке может быть осуществлен mn способами.
Примеры. На основе этих правил в курсе математического анализа легко были получены формулы для числа k-перестановок и числа k-сочетаний из n объектов, а именно
= n(n-1)…(n-k+1)
=
Упражнение. Докажите, что число k-перестановок из n объектов с повторениями равно nk.
Задача. Доказать, что число k-сочетаний из n объектов с повторениями равно .
Решение (Л. Эйлер): Пусть X={1,2,…n} и рассмотрим любое из k-сочетаний с повторениями с1с2…сk этих n чисел (считаем, что в сочетании с1с2…сk элементы выписаны в неубывающем порядке). Естественно, что в каждом сочетании вследствие возможности неограниченных повторений любые рядом стоящие элементы могут быть одинаковыми. Ввиду этого обстоятельства строим с помощью соотношений
d1=c1+0; d2=c2+1;…; di=ci+i-1;…; dk=ck+k-1
последовательность элементов d1d2…dk следовательно, при любых элементах ci элементы di всегда различны. Ясно, что отображение с1с2…сk в d1d2…dk биективно. Число последовательностей из элементов di равно числу k-сочетаний без повторений из элементов от 1 до n+k-1, т. е. .
Производящие функции для сочетаний.
Для примера рассмотрим три объекта, обозначенные x1, x2, x3. Образуем произведение
(1+x1t)(1+ x2t)(1+x3t).
Перемножив и разложив это произведение по степеням t, получим
1+(x1+x2+x3)t+(x1x2+x1x3+x2x3)t2+x1x2x3t3,
или
1+а1t+а2t2+а3t3,
где а1, а2, а3 – элементарные симметрические функции трех переменных x1, x2, x3. Эти симметрические функции определяются вышеприведенным выражением. Можно заметить, что число слагаемых каждого коэффициента аm (m=1,2,3) равно числу сочетаний из трех элементов по k. Следовательно, число таких сочетаний получается приравниванием каждого xi единице, т. е.
(1+t)3=
Для случая n различных объектов, обозначенных x1, . . . , xn ясно, что
(1+x1t)(1+ x2t) . . . .(1+xnt)=
=1+a1(x1,. . ., xn)t+ a2(x1,. . ., xn)t2+. . .+ an(x1,. . ., xn)tn
и
(1+t)n==;
поэтому выражение (1+t)n называют перечисляющей функцией сочетаний из n различных объектов. Этот результат можно также обосновать следующими комбинаторными рассуждениями:
В произведении (1+x1t)(1+ x2t) . . . .(1+xnt) каждый множитель является биномом, который благодаря наличию в нем слагаемых 1 и xi указывает на возможность наличия или отсутствия в каждом из сочетаний элемента xi. Это произведение порождает сочетания, так как коэффициент при tm в нем получается выбором “1” в n-m из n двучленных множителей и в m оставшихся после такого выбора множителях - членов вида xit всеми возможными путями. Эти коэффициенты по самому их определению являются m-сочетаниями. Каждый элемент в любом сочетании может появляться не более одного раза, ибо любой множитель состоит только из двух слагаемых.
Обобщая эти комбинаторные рассуждения, для случая, когда прежние множители вида 1+xit заменяются множителями вида 1+xt+xt2+ … +xtj, построим производящую функцию для сочетаний, в которых элементы xi могут содержаться 0,1,2,…,j раз. Более того, множители производящей функции можно совершенно независимо друг от друга приспосабливать к любым требованиям задачи. Так, например, если xk должно всегда входить четное число раз, но не более чем 2k раз, то k-й множитель следует выбирать в виде
1+xt+xt4+ … +xt2k .
Таким образом, производящая функция для любой задачи описывает не только виды элементов, но и виды искомых сочетаний.
Пример. Для сочетаний с неограниченным повторением элементов n и без ограничения на число появлений любого элемента перечисляющей производящей функцией будет
(1+t+t2+. . .)n
или, что же самое
(1-t)-n = ==.
Упражнение. 1. Постройте производящую функцию для сочетаний с повторениями, в которых каждый элемент входит, по крайней мере, один раз.
2. Постройте производящую функцию для сочетаний с повторениями, в которых любой элемент обязательно появляется в сочетании, но только четное число раз.
Производящие функции для перестановок.
В случае коммутативных алгебраических операций произведения х1х2 и х2х1 одинаковы. Поэтому производящую функцию, описывающую перестановки, невозможно построить так, как это было сделано для сочетаний. В случае n различных элементов из соотношения p(n,m)=”число m-перестановок” вытекает, что (1+t)n = , т. е. в разложении выражения (1+t)n число p(n,m) является коэффициентом при . Этот факт указывает пути обобщения.
Если какой-либо элемент может появляться 0,1,…,k раз или если существует k элементов данного вида, то множитель 1+t в левой части равенства заменяется множителем 1+t++…+. Это объясняется тем, что число перестановок из n элементов, p из которых одного вида, q другого и т. д., равно
.
Это число оказывается коэффициентом при в произведении
, n=p+q+…,
что в точности соответствует необходимым требованиям.
Определение и простейшие свойства производящих функций.3
Определение. Обычной производящей функцией для последовательности a0,a1,… называется формальная сумма
A(t)=a0+a1t+a2t2+ … antn+… . (1)
Экспоненциальной производящей функцией для той же последовательности называется сумма
Е(t)=a0+a1t+a2t2/2!+ … antn/n!+… . (2)
В связи с этими определениями необходимо сделать несколько замечаний. Во-первых, элементы последовательности a0,a1,…, как видно, из самих обозначений, упорядочены, но не обязательно должны быть различны. Во-вторых, переменная t производящей функции никак не определена.
На производящих функциях можно определить формальные операции, такие как сложение, умножение, дифференцирование и интегрирование по t, и выявить зависимости в этой алгебре, в частности путем приравнивания коэффициентов при степенях tn после выполнения этих операций. С этой точки зрения неуместно ставить вопрос о сходимости соответствующих рядов.
Алгебра степенных рядов A(t), определяющих производящие функции, известна под именем алгебры Коши, а алгебра степенных рядов E(t), определяющих экспоненциальные производящие функции, известна как символическое исчисление Блиссара. В статистике функция E(t) фигурирует как производящая функция моментов; E(t) используется также в теории чисел.
В комбинаторике неизбежно возникают производящие функции, отличные от А(t) или E(t), например, сумма вида
G(t)= a0f0(t)+a1f1(t)+a2f2(t)+ … anfn(t)+…, (*)
для которой единственным требованием является линейная независимость функций f0(t), f1(t),…(для того чтобы сделать выражение однозначным). A(t) и E(t) являются частными случаями этого выражения.
Наконец, для любителей операций над непрерывными переменными следует отметить, что аналогом обычной производящей функции с одной переменной служит несобственный интеграл
А(t)=
Этот факт, по-видимому, более известен для случая экспоненциального ядра е-tk, т. е. для преобразования Лапласа
А(t)=
Выражение, включающее в себя как частные случаи оба приведенные выше интеграла и степенные ряды, представляет собой интеграл Стильтьеса
А(t)=,
в котором t – параметр. Чтобы получить сумму (1), в качестве функции F(t,k) выбираем ступенчатую функцию. Эта функция имеет скачки при к=0,1,2,…; скачок в точке k равен tk.
Некоторые простейшие производящие функции.
ak |
A(t) |
E(t) |
ak |
(1-at)-1 |
Exp at |
k |
t(1-t) |
t exp t |
k(k-1) |
2t2(1-t)-3 |
t2 exp t |
k2 |
t(t+1)(1-t)-3 |
t(t+1) exp t |
c |
(1+t)n |
- |
n(n-1)…(n-k+1) |
- |
(1+t)n |
Упражнение. Докажите справедливость приведенных формул.
Элементарные соотношения между обычными производящими функциями.
Обозначим через A(t), B(t), C(t) производящие функции, соответствующие последовательностям (ак), (bк), (cк), тогда в качестве непосредственного следствия из самого определения последовательности (а) получаем две пары соотношений; в каждой паре выполнение одного из соотношений влечет за собой выполнение второго
Сумма ак=bк+cк
A(t)=B(t)+C(t)
Произведение ак=bкc0+bк-1c1+…+b1cк-1+b0cк
A(t)=B(t)C(t)
Последовательность (ак) называется сверткой (bк) и (cк), если A(t)=B(t)C(t). Сумма и произведение обладают свойствами коммутативности и ассоциативности.
Для экспоненциальных производящих функций соответствующие соотношения определяются следующим образом:
Пусть E(t), F(t), G(t) экспоненциальные производящие функции, соответствующие последовательностям (eк), (fк), (gк), тогда
Сумма eк=fк+gк
E(t)=F(t)+G(t)
Произведение eк=fкg0+fк-1g1+…+f1gк-1+f0gк
E(t)=F(t)G(t)
Решение линейных рекуррентных уравнений.
Пример. Найдем производящую функцию к числам Фибоначчи: F0=F1=1, Fn+2=Fn+Fn+1, n0.
Производящая функция F(t) для последовательности F(0),F(1),F(2),… удовлетворяет уравнению
F(t)==1+t+=
1+t+t2+t=
1+t+t2F(t)+x(F(t)-1)= 1+(t+t2)F(t),
т. е. F(t)=(1-t-t2)-1.
Найдя корни уравнения 1-t-t2=0, получаем разложение
1-t-t2=(1-аt)(1-bt), где а=(1+5)/2, b==(1-5)/2.
Используя метод неопределенных коэффициентов, найдем
=+
т. е.
F(t)=A(1-at)-1+B(1-bt)-1=A+B=tk
и
Fk=+
Замечание. этот метод можно перенести на произвольное линейное уравнение с постоянными коэффициентами.
Задача 1. Пусть задана последовательность Фибоначчи
F0=F1=1, Fn+2=Fn+Fn+1, n0.
Рассмотрим множество последовательностей из нулей и единиц длины n, в которых нет двух рядом стоящих единиц. Пусть таких последовательностей A(n). Тогда А(n)=Fk+1.
Доказательство.
Имеем А(0)=1, так как существует только одна – пустая, такая последовательность; А(1)=2, так как существует две такие последовательности – ‘0’ и ‘1’.
Заметим, что число последовательностей длины n, у которых на n месте находится нуль, равно А(n-1).
Все последовательности длины n+1 могут быть построены из последовательностей длины n приписыванием к каждой из них на n+1 место нуля и, кроме того, тем из них, которые на n месте имеют ноль, можно также приписать единицу. Таким образом, А(n+1)=A(n)+A(n-1)=Fn+1+Fn=Fn+2.
Задача 2. n>0 А(n)==.
Доказательство.
А(n) можно получить следующим образом:
Заметим, что каждая такая последовательность длины n может содержать не более [(n+1)/2] единиц. Подсчитаем, сколько существует последовательностей, содержащих k единиц, 0k[(n+1)/2]. Если последовательность имеет к единиц, то она содержит n-k нулей. Рассмотрим последовательность из n-k нулей. Тогда в этой последовательности имеется n-k+1 мест для расстановки k единиц. Т. е. общее число требуемых последовательностей длины n,содержащих k единиц, равно . Таким образом, A(n)= .
Для дальнейшего анализа задач, связанных с двоичными деревьями определим их число, т. е. вычислим число неизоморфных двоичных деревьев с n вершинами.
Пусть Cn – число неизоморфных двоичных деревьев с n вершинами, тогда
C0 = 1 - одно дерево, представленное пустым множеством вершин
C1 = 1
C2 = 2
C3 = 5
Из рекурсивного определения бинарного дерева справедливо следующее рекуррентное соотношение
C0=1
Cn=Ck Cn-k n>0
Рассмотрим производящую C(x) = , тогда на основе определения произведения производящих функций и указанного выше рекуррентное соотношение имеем
C(x) = xC2(x)+1
или
xC2(x)-C(x) +1 = 0 {*}
Предположим, что существует функция C(x), аналитическая в окрестности нуля, удовлетворяющая этому уравнению. В силу регулярности такой функции существует ее разложение в окрестности нуля в степенной ряд (ряд Тейлора) и этот ряд удовлетворяет этому же уравнению {*}.
Для того чтобы найти необходимую аналитическую функцию, рассмотрим {*} как квадратное уравнение относительно C(x). Значение искомой аналитической функции в точке x, при x0
C(x) = {**}
Найдем разложение C(x) в степенной ряд
Разложим в ряд Маклорена
Для n>0 имеем
= (-1)( -2) (-n+1)(-4)n =
= 2n(-1)13 (2n-3)
и следовательно
= 1- = 1- = 1-2 =
1-
отсюда видно, что для получения решения с положительными коэффициентами следует в {**} выбрать знак минус.
Т. е.
C(x) = = = .
Отсюда окончательно получаем
Cn =
Число Cn называется числом Каталана, они часто появляются в контексте целого ряда других комбинаторных задач.
Во многих приложениях удобно представлять перестановки в циклической форме.
Рассмотрим производящую функцию Сn(t)=, определяющую число перестановок n-го порядка, имеющих k циклов, т. е. С(n,k) определяет число перестановок n-го порядка, имеющих k циклов. Тогда
C(0,0)=1,
C(n,0)=0, при n>0,
C(n,k)=0, при к>n,
Для n>0, C(n,k)=С(n-1,k-1)+(n-1)C(n-1,k) или Cn(t)=(t+n-1)Cn-1(t).
Докажем последнее утверждение.
Все ниже рассматриваемые перестановки представлены в канонической циклической форме. Заметим, что если максимальное число в такой перестановке расположено на первом месте, то оно образует отдельный цикл (так как оно является левосторонним минимумом и следующее за ним число также левосторонний минимум). Если же оно расположено на любом другом месте, то оно входит в какой-то цикл длины, большей единицы. Перестановка n-го порядка, содержащая k циклов, может быть получена либо добавлением n на первое место в перестановку (n-1)-го порядка, содержащую k-1 цикл, либо добавлением n в перестановку(n-1)-го порядка, содержащую k циклов, на любое место со второго до n-го.
Следствие. Учитывая, что C1(t)=t, получаем
Cn(t)=t(t+1)…(t+n-1).
Числа Стирлинга первого и второго рода.
Обозначение. (t)n=t(t-1)…(t-n+1).
Числа Стирлинга определяются следующим образом. Положим
(t)0=t0=s(0,0)=S(0,0)=1
(t)n=t(t-1)…(t-n+1)=, n>0 (1)
tn=, n>0. (2)
Тогда s(n,k) и S(n,k) называются числами Стирлинга соответственно первого и второго рода. Заметим, что числа обоих рядов отличаются от нуля только для k=1,2,…,n, n>0 и что (t)n является обычной производящей функцией для s(n,k), тогда как tn является новым типом производящей функции для входящей в уравнение (*) функции fk(t), равной (t)k.
Упражнение. Докажите, что совокупность функций {(t)0,(t)1,…,(t)n} линейно независима.
Для заданного n или k числа Стирлинга первого рода s(n,k) могут иметь тот или иной знак, действительно
(-t)n=(-1)nt(t+1)…(t+n-1),
тогда из (1) немедленно следует, что (-1)n+ks(n,k) всегда положительно. Кроме того, учитывая вид производящей функции Сn(t), получаем С(n,k)=(-1)n+ks(n,k). Т. е модули чисел Стирлинга первого рода s(n,k) определяют число перестановок n-го порядка с k циклами.
Рекуррентные соотношения для чисел Стирлинга первого рода s(n k) вытекают из соотношения для факториалов (t)n=(t-n+1) (t)n-1, т.е.
s(n,k)=s(n-1,k-1)-(n-1)s(n-1,k).
Для чисел Стирлинга второго рода, используя (2), находим
tn==t=
и
S(n+1,k)= S(n,k-1)+k S(n,k). (3)
С числами Стирлинга второго рода можно связать разбиения конечных множеств, а именно:
Пусть Х={1,2,…,n}, рассмотрим всевозможные разбиения Х на k блоков. Множество таких разбиений будем обозначать Пk(X), пусть u(n,k)=|Пk(X)|, тогда
u(0,0)=1 u(n,k)=u(n-1,k-1)+ku(n-1,k). (4)
Доказательство.
Разобьем Пk(X) на два различных класса:
-
тех разбиений, которые содержат одноэлементный блок {n}, и
-
тех разбиений, для которых n является элементом большего (по крайней мере, двухэлементного) блока.
Мощность первого класса равна u(n-1,k-1). Т. е. такова, каково число разбиений множества {1,2,…,n-1} на k-1 блоков.
Мощность другого класса составляет ku(n-1,k), так как каждому разбиению множества {1,2,…,n-1} на k блоков соответствует в этом классе в точности k разбиений, образованных добавлением элемента n поочередно к каждому блоку.
Следствие. Сравнивая (3) и (4), получаем S(n,k)=u(n,k), т. е.
Числа Стирлинга 2-го рода S(n,k) определяют число разбиений n-элементного множества на k дизъюнктных блоков.
Теорема . Пусть |X|=n, |Y|=k, то число всех функций f:XY и f(X)=Y, равно Sn,k=k!S(n,k).
Доказательство.
Зафиксируем конкретное разбиение Х на k дизъюнктных подмножеств, тогда существует k! вариантов отображений, при которых каждому элементу разбиения сопоставляется биективно элемент Y. Каждое конкретное разбиение можно выбрать S(n,k) способами.
Принцип включения и исключения. (было у И. В. Романовского)
Пусть A1,…,An некоторые подмножества (необязательно различные) конечного множества Х.
Теорема 1.(Принцип включения и исключения).
-+-…(-1)n-1||
Доказательство
Применим математическую индукцию по n.
Для n=1 терема очевидно справедлива!
Предположим, что для произвольных A1,…,An-1 выполняется
||=-+-…(-1)n-2||
Применяя эту формулу к сумме
,
получаем
||=-+…(-1)n-2||,
а отсюда
||==+|An|-||=
-+-…(-1)n-1||.
Покажем несколько применений принципа включения и исключения
Теорема 2. Пусть |X|=n, |Y|=k, то число всех функций f:XY и f(X)=Y, равно
Sn,k=
Доказательство
Пусть У={y1,…,yk} и Ai={f : f:XY & yif(X)}, тогда
f(X)Yf
Множество всех f:XY имеет мощность kn. Определим , пусть 1p1…pik пересечение есть множество всех функций f:XY таких, f(X), a, следовательно, мощность этого пересечения ровно (m-i)n. Согласно теоремы 1 имеем
Sn,k=kn-||=kn- =
Эта формула дает простое выражение для вычисления чисел Стирлинга 2го рода
S(n,k)= Sn,k=
Рассмотрим вопрос об определении числа “беспорядков” на множестве {1,…,n}
Определение. Под беспорядком на множестве {1,…,n} будем понимать произвольную перестановку f этого множества, такую что f(i)i для 1in.
Пусть Dn – множество всех беспорядков на {1,…,n} и
Ai={fSn: f(i)=i}, i=1,…,n.
Заметим, что fDn f Ai для i{1,…,n}, следовательно
|Dn|=|Sn|-+-+…(-1)n-1||
Для произвольной последовательности 1p1…pin пересечение является множеством таких перестановок f, для которых f(pj)=pj для 1jn, и значит, ||=(n-i)!. Заметив, что последовательность 1p1…pin можно выбрать способами, получаем в итоге
|Dn|== =n!( )
Отметим, что сумма в скобках является начальным членом ряда е-1=. Это означает, что беспорядки составляют е-1=0.36788… всех перестановок.
Упражнение. Напишите программу порождения всех “беспорядков” размерности n,
материал взят из монографии: А. Ахо, Дж. Хопкрофт, Дж. Ульман. Построение и анализ вычислительных алгоритмов. – М.; Мир,1979
А. Ахо, Дж. Хопкрофт, Дж. Ульман. Построение и анализ вычислительных алгоритмов. – М.; Мир,1979
1 Перманенты квадратных матриц является частным случаем перманентов прямоугольных матриц. Теория перманентов рассматривается в комбинаторной математике. Она имеет приложение к решению теоретико-вероятностных, комбинаторных и физических задач [3].
2Обработка информации, хранящейся в узлах бинарного дерева, по левостороннему обходу характеризуется тем, при обработки каждой вершины вначале совершается обход левой ветви, выходящей из этой вершины; затем обработка информация хранящейся непосредственно в этой вершине; после этого, обход правой ветви, исходящей из вершины.
материал взят из монографии: А. Ахо, Дж. Хопкрофт, Дж. Ульман. Построение и анализ вычислительных алгоритмов. – М.; Мир,1979
Д. Кнут ‘Искусство программирования для ЭВМ’. Т 3, 5.3.3, упражнение 16.
3 Материал взят из книги Дж. Риордан ‘Введение в комбинаторный анализ’ ИЛ, М., 1962