Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Комдинаторика для программистов - В. Липский

.pdf
Скачиваний:
1035
Добавлен:
24.05.2014
Размер:
1.6 Mб
Скачать

1.14. Задачи

71

11.Доказать, что множество всех чётных перестановок образует группу.

12.Доказать, что алгоритм 1.10 будет генерировать все перестановки (в несколь-

ко иной очерёдности), если убрать команду P [i] :=: P [m] в строке 15. Пусть f1, f2, . . . , fn! будет последовательность перестановок, полученных с помощью такого модифицированного алгоритма. Доказать, что последо-

вательность n! элементов f11(i), f21(i), . . . , fn!1(i) является для каждого i (1 ≤ i ≤ n) одинаковой с точностью до циклического сдвига (ср. [45]).

13. Доказать, что ассимптотическое значение (для n → ∞) среднего числа транспозиций, приходящихся на каждую перестановку, полученную при

 

 

x2k

, ес-

помощи алгоритма 1.10, равно cosh 1 = 1, 543 . . . cosh x = k=0 (2k)!

ли же алгоритм модифицирован так, как в предыдущей

задаче, то это

 

 

x2k+1

 

 

 

 

 

 

значение составляет sinh 1 = 1, 175 . . . sinh x = k=0 (2k+1)! .

 

14. Доказать, что каждое из чисел 0, . . . , n! 1 можно однозначно предста-

вить в виде j = n−1 dk k!, где 0 ≤ di ≤ i, причём последовательности

k=1

dk−1, . . . , d1, соответствующие очередным числам, появляются в лексикографическом порядке. Преложите алгоритм построения последовательности dk−1, . . . , d1 , соответствующей числу j.

15.Удалить рекурсию из алгоритма 1.11. Описать такую реализацию, в которой число шагов, необходимых для построения каждой следующей перестановки (не только среднее значение числа шагов!) ограничено констан-

той, не зависящей от n. (Указание: рассмотрим лексикографически упорядоченный список Ln всех последовательностей cn, . . . , c2 , где 1 ≤ ci ≤ i.

Доказать, что i-я транспозиция, проведённая алгоритмом 1.11, имеет вид P [B[p, cp]] :=: P [p], где p = min{i : ci < i}, а cn, . . . , c2 есть j-я последовательность в списке Ln. Дальнейшие последовательности в списке Ln мож-

но эффективно генерировать, представляя последовательность cn, . . . , c2 последовательностью c¯n, . . . , c¯2 , где c¯i = 1, если ci = i и c¯i = ci в противном случае, или же, используя буфер, фактическим содержанием которого всегда является последовательность a1, b1, a2, b2, . . . , as, bs, такая, что

s

{i : aq ≤ i ≤ bq} = {i : ci < i}

q=1

Найбольший элемент буфера определяет ранее упомянутый индекс.)

72

Глава 1. Введение в комбинаторику

16.Написать программу, реализующую «обычную» нерекурсивную версию алгоритма 1.11, а также версию, описанную в предыдущей задаче. Проверить эмпирически, выполнив программу, сильнее ли последняя версия в смысле времени, необходимого для построения каждой следующей перестановки.

17.Предположим, что для каждого нечётного m имеет место соотношение

B[m, 1] = . . . = B[m, m − 1] = b(m), и что для произвольного нечётного m ≥ 4 последовательность B[m, 1],. . . ,B[m, m − 1] удовлетворяет одному из следующих условий:

(i)Каждый из элементов 1, . . . , m−1 появляется в ней в точности один раз, причём расстояние между позициями, содержащими m − 1 и b(m−1) чётное (расстояния между позициями i, j понимаем как |i − j|).

(ii)Каждый из элементов множества {1, . . . , m − 1}\{m − 1, b(m−1)} появляется дважды, причём расстояние между этими вхождениями нечётное.

Доказать, что в этом случае процедура P ERM (n) генерирует все перестановки элементов P [1], . . . , P [n], причем ϕn (см. доказательство корректности алгоритма 1.11) является транспозицией для каждого нечётного n ≥ 3

ициклом длины n для каждого чётного n (ср. [44]).

18.Пользуясь предыдущим заданием, доказать, что следующие варианты процедуры B(m, i) в алгоритме 1.11 приводят к правильному алгоритму генерирования всех перестановок:

(1)if (m mod 2 = 0 ) then

if i>1 then B:=m − i else B:=m − 2

else B:=m − 1

(2) if m mod 2 = 0 then

if (i=1) or (i=m − 1) then B:=m − 1 else B:=i

else B:=1

(3)if (m mod 2 = 0) and (i>2) then B:=m − i else B:=m − 1 (*Wells[71]*)

(4)if m mod 2 = 0 then B:=i else B:=1 (*Heap[32]*)

1.14. Задачи

73

(5)if m mod 2 = 0 then B:=i else B:=m − 2

Какой вид имеет перестановка ϕn в каждом из этих случаев? Дать другие возможные варианты этой процедуры.

19. Доказать, что среднее число шагов, необходимое для генерирования каждой следующей перестановки в алгоритме 1.12, ограничено константой, не зависящей от n. Представить такой вариант алгоритма, в котором это замечание справедливо также для числа шагов для каждой конкретной перестановки (ср. с задачей 1.15).

20. Алгоритмы 1.11 и 1.12 генерируют последовательности, содержащие попеременно чётные и нечётные перестановки (почему?). Верно ли это замечание для алгоритма 1.10?

21.

Доказать, что среднее число шагов, необходимое для генерирования каж-

 

дого следующего подмножества с помощью алгоритма 1.13, ограничено

 

константой, не зависящей от n. Предложить вариант алгоритма, в кото-

 

ром это верно также для каждого конкретного подмножества (см. задачу

 

1.15).

22.

Предложить нерекурсивную версию алгоритма, генерирующего все под-

 

множества с повторениями.

23.

Использовать алгоритм 1.13 для решения следующей задачи: даны n + 1

 

d-мерных векторов a1, . . . , an, s с целыми координатами. Проверить, суще-

 

ствует ли подмножество J {1, . . . , n}, такое что j J aj = s.

24.

Доказать тождества

 

k

k

k − 1 k − 2

 

0

 

n + 1

= n

+ n − 1

+ n − 2

 

+ . . . + n − k ,

k + 1 k

k

 

k

 

k

 

 

n + 1 = n +

n − 1

+

n − 2

 

+ . . . +

n − k

 

двумя способами: многократно применяя формулу (1.17) и придавая правой части некоторую комбинаторную интерпретацию (например, в первом

тождестве n−j есть число k-элементных подмножеств A {0, . . . , n}, та-

k−j

ких что min{i : i / A} = j ).

. Дайте комбинаторную интерпретацию коэффи-

74

 

 

 

 

 

 

 

 

Глава 1. Введение в комбинаторику

где

 

и

n−1

n

 

25. Доказать тождество n

k−1

 

= k

k

, подсчитав двумя способами пары a, K ,

 

a

K

 

K является k-элементным подмножеством фиксированно-

го n-элементного множества X. Использовать это тождество для вывода формулы (1.21)

26.Доказать, что произведение k произвольных последовательных натуральнх чисел делится на k!. (Указание: рассмотреть биномиальный коэффи-

циент n+k ).

k

27. Доказть, что для прозвольных натуральных чисел p, q, n

[p + q]n

= k=0

k [p]k [q]n−k ,

 

n

n

 

 

 

[p + q]n = k=0

k [p]k [q]n−k .

 

n

n

 

 

 

(Указание: для доказательства первого тождества подсчитайте двумя спо-

собами число всех взаимно однозначных функций f : X → P Q, где |X| = n, |P | = p, |Q| = q, P Q = . Для второго тождества найти по-

добную интерпретацию в терминах размещений, упорядоченных в p + q

ячейках.)

28. Доказать, что

(x1 + x2 + . . . + xp)n =

где

n

 

n!

 

 

 

 

n1n2...np

 

= n1!n2!...np !

 

циентов. Чему равно

 

n

k ?

 

kn

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

n1+ p

 

n

 

 

 

xn1

. . . xnp ,

 

 

1

p

...+n =n

n1n2 . . . np

 

 

 

29.Дать нерекурсивную версию алгоритма генерирования k-элементных подмножеств, основанную на формуле (1.25). Показать, что рекуррентная зависимость

G(n, k) = G(n − 1, k),

G(n − 2, k − 2) {n − 1, n}, G (n − 2, k) {n}

определяет также некоторый список k-элементных подмножеств, в котором соседние подмножества мало отличаются друг от друга. Дать нерекурсивный алгоритм, основанный на этой зависимости.

1.14. Задачи

 

 

75

30. Показать, что

решётка

разбиений не является дистрибутивной, т.е.

µ. (σ !

µ) = π(

σ) !(π

µ). Указать соответствующие разбиения π, σ,

π

 

 

 

31.Доказать, что число последовательностей длины n с элементами из k-

элементного множества, содержащих каждый элемент этого множества по крайней мере один раз, равно k!S(n, k).

32.Разбиение π n-элементного множества X имеет тип 1λ1 2λ2 . . . nλn (где λ1 +

2λ2 + . . . + n

= n), если оно содержит λi

i-элементных блоков для

i = 1, 2, . . . , n. Доказать, что число разбиений типа 1λ1 2λ2 . . . nλn равно

n!

 

 

 

 

 

 

 

 

 

 

 

(λ1!...λn !(1!)λ1 ...(n!)λn ) .

 

 

 

 

 

 

 

 

 

 

33. Обозначим для каждого k ≥ 0

 

 

 

 

 

 

 

 

 

 

dk

 

dk

 

 

 

 

 

 

 

 

g(k) = dxk g(x), f (k) =

dyk f (y) |y=g(x)

 

 

Доказать, что

 

 

 

 

 

 

 

 

 

 

 

n

n

 

 

f (j) n!

g

(1)

 

k1

. . . g

(n) kn

d n f (g(x)) =

 

 

 

k1

 

kn

dx

j=0

k +k +...+k =j

k !(1!)

 

. . . kn!(n!)

 

 

 

 

1 2

n

1

 

 

 

 

 

 

k1+2k2

+...+nk =n

 

 

 

 

 

 

 

 

 

n

 

 

 

 

 

 

 

 

 

 

k1,k2,...,kn ≥0

 

 

 

 

 

 

 

 

Показать, что

сумма

коэффициентов при

 

всех

слагаемых вида

f (j) g(1) k1 . . . g(n) kn равна числу Белла Bn.

34.Доказать, что для каждого m ≥ 0 марица чисел Стирлинга первого ро-

да [s(n, k)]0≤n,k≤m есть обратная матрица для матрицы чисел Стирлинга второго рода [S(n, k)]0≤n,k≤m

35.Доказать, что

n

[x]n = |s(n, k)| xk

k=0

36.Доказать, что |s(n, k)| есть число тех перестановок n-элементного множества, которые имеют в разбиении на циклы в точности k циклов.

37.Рассмотрим следующую программу:

76

Глава 1. Введение в комбинаторику

min :=

for i:=1 to n do

if P [i] < min then min:=P [i];

Доказать, что вероятность того, что для произвольно выбранной перестановки P [1], . . . , P [n] команда min := P [i] будет выполняться в точности k раз, составляет |s(n, k)|/n!. Доказать, что среднее число выполнений указанной команды для произвольно выбранной перестановки есть O(log n),

точное значение равно

n

1

. (Указание: подсчитать число циклов во всех

 

 

=1

k!

 

n! перестановках.)

 

 

k

 

 

38.Доказать, что среднее число шагов, необходимых для построения каждого следующего разбиения в алгоритме 1.19, ограничено константой, не зависящей от n. Дать модификацию алгоритма, гарантирующую ограниченность этого числа константой для каждого порождённого разбиения (ср. с задачей 1.15).

39.Доказать, что число разбиений числа n, в котором ни одно из слагаемых не превосходит k, равно числу разбиений числа n + k на k слагаемых, т.е.

P (n + k, k).

40.Доказать, что число самосопряжённых разбиений числа n (т.е. равных сопряжённому разбиению) равно числу разбиений числа n на попарно различные нечётные слагаемые.

41.Обозначим через E(n) и O(n) соответственно число разбиений числа n на попарно различимые чётные слагаемые и на попарно различимые нечётные слагаемые. Доказать, что

E(n)

O(n) =

(1)k ,

если n имеет вид (3k2 ± k)/2

 

 

0

в противном случае

42.

Разработать алгоритм генерирования всех P (n, k) разбиений числа n на

 

k слагаемых в порядке, обратном лексикографическому, такой что чис-

 

ло шагов, необходимых для построения каждого следующего разбиения,

 

ограничено константой, не зависящей от n.

43.

Ряд

ckk! xk

k=0

1.14. Задачи

77

будем называть экспоненциальной производящей функцией для последовательности c0, c1, . . .. Пусть ck — число различных последовательностей длины k с элементами из множества Y = {y1, . . . , yn}, в которых число появлений элемента yi принадлежит множеству {mi1, mi2, . . .} (mi1 < mi2 <

. . .). Доказать, что экспоненциальная производящая функция для последовательности c0, c1, . . . есть

xm11

xm12

 

 

xm21

 

xm22

+ . . .

xmn1

xmn2

+ . . .

c(x) = m11!

+ m12!

+ . . . m21!

+ m22!

. . . mn1!

+ mn2!

44. Доказать, что

 

 

 

 

 

 

 

 

 

 

 

 

 

n

 

k

 

(n+1)/2

n − k

 

 

 

Fn+1 = k=0

=

k=0

 

 

 

 

n

k + 1

 

 

 

 

k + 1

 

 

 

 

 

 

 

 

 

 

 

 

 

 

45.Доказать, что число бинарных последовательностей длины n, не содержащих единиц ни на каких двух соседних позициях, равно числу Фиббоначчи

Fn+1.

46.Описать метод решения возвратных уравнений вида

C0an + C1an−1 + . . . + Cr an−r = 0

(с начальными условиями, определяющими значения a0, a1, . . . , an−1) при помощи производящих функций, аналогичный методу, использованному для нахождения формулы (1.65), определяющей числа Фиббоначчи.

47.Пусть pn — число всевозможных расположений скобок в произведении x0 . . . xn (например, p2 = 2, так как имеется два способа расстановки скобок: (x0x1)x2, x0(x1x2)). Доказать, что pn равно числу Каталана cn.

48.Доказать, что число способов, которыми можно разбить плоский выпуклый (n + 2)-угольник на различные треугольники с помощью n − 1 диагоналей, не пересекающихся внутри этого (n + 2)-угольника, равно числу Каталана cn.

49.Обозначим через π(x) количество простых чисел, не превосходящих x. До-

казать, что

π(n)−π

n

= n−11 i k

"pi #+1

i<j k

"pipj

#−. . .+(1)k "p1p2

. . . pk #,

 

 

 

n

 

n

 

n

 

 

 

 

 

 

≤ ≤

 

≤ ≤

 

 

 

где k = π ( n)

78

Глава 1. Введение в комбинаторику

50.Обозначим через ϕ(n) количество натуральных чисел, не превосходящих n и взаимно простых с n (т.е. не имеющих общего делителя, большего единицы). Доказать, что

ϕ(n) = n 1

i=1

q

i

+

 

 

q q

j

. . . + ( 1)m q

q

. . . q

= n

i=1

1

q

i

,

 

 

1 i j m

i

1

2

1

m

 

 

 

 

m

n

 

 

 

n

 

 

 

 

 

 

m

 

 

1

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

≤ ≤

 

 

 

 

 

 

 

 

 

 

 

 

 

 

где q1, . . . , qm являются различными простыми делителями числа n.

Глава 2

Алгоритмы на графах

2.1Машинное представление графов

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

Мы будем рассматривать как ориентированные, так и неориентированные графы. Граф мы будем всегда обозначать G = V, E , где V обозначает множество вершин, а E — множество ребер1, причем E V ×V для ориентированного графа и E {{x, y} : x, y V x =y} для неориентированного графа. Будем также использовать обозначения |V | = n и |E| = m.

В теории графов классическим способом представления графа служит матрица инциденций. Это матрица A с n строками, соответствующими вершинам, и m столбцами, соответствующими ребрам. Для ориентированного графа столбец, соответствующий дуге x, y E, содержит 1 в строке, соответствующей вершине x, 1 в строке, соответствующей вершине y, и нули во всех остальных строках (петлю, т.е. дугу вида x, x , удобно представлять иным значением в строке x, например, 2). В случае неориентированного графа столбец, соответ-

1В отечественной литературе ребра ориентированного графа принято называть дугами. В дальнейшем мы будем употреблять этот термин везде, где речь идет об орграфах, используя термин «ребро» как более общий. — Прим. перев.

79

80

(а)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

2

 

 

 

 

 

5

1

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

4

 

 

 

 

 

 

 

 

 

 

 

 

 

6

 

 

 

3

 

 

 

 

 

(б)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

6

 

 

 

3

 

4

 

 

 

1

 

 

 

 

 

 

2

 

 

5

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Глава 2. Алгоритмы на графах

2

 

1

0

1

0

0

0

0

 

1

 

-1

-1

0

0

0

0

0

 

4

0

1

-1 -1 0

0

0

3

 

0

0

0

1

1

0

0

 

5

 

0

0

0

0

-1 -1 1

 

6

 

0

0

0

0

0

1

-1

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

2

 

1

0

0

1

1

0

0

0

0

 

1

 

1

1

1

0

0

0

0

0

0

 

4

0

0

0

0

0

1

1

1

0

3

 

0

1

0

1

0

1

0

0

0

 

5

 

0

0

1

0

1

0

1

0

1

 

6

 

0

0

0

0

0

0

0

1

1

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Рис. 2.1: а) ориентированный граф и его матрица инциденций; б) неориентированный граф и его матрица инциденций

ствующий ребру {x, y}, содержит 1 в строках, соответствующих x и y, и нули в остальных строках. Это проиллюстрировано на рис. 2.1. С алгоритмической точки зрения матрица инциденций является, вероятно, самым худшим способом представления графа, который только можно себе представить. Во-первых, он требует mn ячеек памяти, причем большинство этих ячеек вообще занято нулями. Неудобен также доступ к информации. Ответ на элементарные вопросы типа «существует ли дуга x, y ?», «к каким вершинам ведут ребра из x?» требует в худшем случае перебора всех столбцов матрицы, а следовательно, m шагов.

Лучшим способом представления графа является матрица смежности, определяемая как матрица B = [bij ] размера n × n, где bij = 1, если существует ребро, идущее из вершины x в вершину y, и bij = 0 в противном случае. Здесь