- •7.091501: "Комп'ютерні системи та мережі"
- •7.091502: ”Системне програмування”
- •Лабораторна робота №1
- •Теоретичні відомості
- •Задачі на теорію множин
- •Задачі для самостійної роботи студентів
- •Завдання
- •Зобразити множину ab-c
- •Приклад відношень g
- •Контрольні питання
- •Лабораторна робота №2
- •Теоретичні відомості
- •Задачі на теорію множин
- •Задачі для самостійної роботи студентів
- •Контрольні питання
- •Лабораторна робота №3
- •Теоретичні відомості
- •Формули з’єднань
- •Біном Ньютона
- •2) Основна властивість біноміальних коефіцієнтів
- •Правило суми
- •Перестановки
- •Перестановки з повторенням
- •Розміщення
- •Розміщення з повтореннями
- •Сполучення
- •Сполучення з повтореннями
- •Біном Ньютона
- •Поліноміальна формула
- •Задачі для самостійної роботи студента
- •Контрольні питання
- •Лабораторна робота №4
- •Теоретичні відомості.
- •Лінійні рекурентні співвідношення з постійними коефіцієнтами
- •Твірна функція
- •Розбиття множини на підмножини
- •Задачі по темі Твірні функції:
- •Задачі для самостійної роботи студентів
- •Контрольні питання
- •Лабораторна робота №5.
- •Теоретичні відомості
- •Способи збереження інформації о графах
- •Задачі на теорію графів
- •Задачі для самостійної роботи студентів
- •Ізоморфізм графів
- •Досяжність і зв’язність.
- •Орієнтовані графи
- •Процедура пошуку в глибину у графі
- •Пошук у ширину
- •Ейлерові цикли
- •Гамільтонові цикли
- •Алгоритми пошуку мінімальних шляхів у графі
- •Задачі на теорію графів
- •Задачі для самостійної роботи студентів
- •Плоскі графи. Розфарбування графа
- •Контрольні питання
- •Пошук максимального потоку у мережі
- •Задачі з теорії графів
- •Задачі для самостійної роботи студентів
- •Лабораторна робота №8.
- •Теоретичні відомості
- •Задачі з теорії кодування
- •Задачі для самостійної роботи студентів
- •Контрольні питання
- •Список рекомендованої літератури
Твірна функція
Твірна функція — це функція, що дозволяє визначити явний вид загального члена розглядаємої числової послідовності. Якщо мається послідовність {an}, для головного члена a якої потрібно знайти загальну формулу, уведемо функцію
![]()
Якщо, використовуючи властивості розглянутої послідовності, удасться вирішити складені для A(x) рівняння, то можна буде одержати елементи послідовності.
Експоненціальною твірною функцією послідовності а0,а1, ..., an, ... називається ряд
![]()
Розбиття множини на підмножини
Розбиття n-елементної множини X на k блоків — це сімейство Q = {B1, …, Bk}, у якому B1 … Bk = X, Bi Bj = 0, Bi ≠ 0, для 1 ≤ i < j ≤ k. Позначимо множину усіх розбивок множини X на k блоків через Πk(X), а через Π(X) — множина всіх розбивок.
Алгоритм генерування розбивок множини, опишимо в рекурентній формі.
Спочатку зробимо ряд визначень. Можна показати, що розбивка Q множини {1, …, n} однозначно визначає розбивку Qn−1 множини {1, …, n−1}, яка виходить з Q після видалення елемента n (чи порожнього блоку) з відповідного блоку. Також, якщо має місто розбивка W = {B1, …, Bk} множини {1, …, n−1}, то можна відшукати всі розбивки Q множини {1, …, n}, для якої Qn−1 = W. Позначимо таку послідовність через E. Метод генерування разбивок: якщо в нас є список Ln−1 усіх розбивок множини {1, …, n−1}, то список Ln розбивок множини {1, …, n} будемо створювати, замінюючи кожну розбивку Q у списку Ln−1 на відповідну йому послідовність E. Проілюструємо побудову списку Ln для n = 1, 2, 3.
L1 (1)
L2 (1 2) (1)(2)
L3 (1 2 3) (1 2)(3) (1)(2)(3) (1)(2 3) (1 3)(2)
Число Стірлінга другого роду S(n, k) — це число розбивок n-елементної множини на k блоків довільного розміру, але таких, що кожен елемент множини виявляється “приписаний” до одного з блоків:
S(n, k) = | Πk(X) |,
де множина X складається з n елементів. Наприклад, S(4, 2) = 7.
Деякі тотожності, зв'язані з числами Стірлінга другого роду:
S(n, n) = 1, для n ≥ 0,
S(n, 0) = 0, для n > 0,
S(n, k) = S(n−1, k−1) + k(n−1, k), для 0 < k < n
Перші дві формули очевидні. Для довільного k можна вирішити так. Останній елемент або буде являти собою окремий блок у розбивці, і тоді інші елементи можна розбити вже на k — 1 частин S(n — 1, k — 1) способами, або поміщаємо його в непорожній блок. У останньому випадку мається k(n — 1, k) можливих варіантів, оскільки останній елемент ми можемо додавати в кожен блок розбивки перших n — 1 елементів на k частин.
Таким чином,
S(n, k) = S(n — 1, k — 1) + k(n — 1, k),n > 0. (5)
Корисними можуть виявитися також формули, що зв'язують числа Стірлінга з біноміальними коефіцієнтами, що визначають число сполучень:
;
;
Якщо ж значення k тепер не фіксувати і розглянути всі розбивки n-елементної множини, то їхня кількість виражається числом Белла
;
.
Число Белла Bn — це число всіх розбивок n-елементної множини:
Bn = |Π(X)|, де |X| = n.
Розглянемо рекурентне співвідношення:
![]()
Для його доказу досить помітити, що множини усіх розбивок множини X = {1, …, n+1} можна розділити на різні класи в залежності від блоку B, що містить елемент n+1, чи в залежності від множини X \ B. Далі для кожної множини X \ B з {1, …, n} маємо |Π(X \ B)| = B|X\B| розбивок множини X, що містить B як блок. Групуючи класи в залежності від потужності множини X \ B, приходимо до необхідного.
Числа Стірлінга першого роду s(n, k) — це коефіцієнти при послідовних ступенях перемінної x у багаточлені [x]k:
.
Для них визначаються аналогічні рекурентні співвідношення, що і для чисел другого роду:
s(n, n) = 1, для n ≥ 0,
s(n, 0) = 0, для n > 0,
s(n, k) = s(n−1, k−1) + (n−1)s(n−1, k), для 0 < k < n.
Розбиття числа (натурального) n на k доданків — це послідовність a1, …, ak, така що n = a1 + … + ak, a1 ≥ … ≥ ak > 0...
Простий спосіб представлення розбивки числа — діаграма Феррерса. Для розбивки a1, …, ak вона складається з k рядків, що відповідають доданкам розбивки, де i-й рядок складається з ai крапок.
@ @ @ @ @ @
@ @ @ @
@ @ @ @
@ @
Приведемо алгоритм генерування всіх розбивок числа. Позначимо через S[1], …, S[d] саму розбивку числа, а через R[1], …, R[d] — інформацію про то, скільки разів доданок S[i] з'являється в розбивці.
1 begin
2 S[1] := n; R[1] := 1; d := 1;
3 write();
4 while S[1] > 1 do
5 begin sum := 0;
6 if S[d] = 1 then
7 begin sum := sum + R[d]; d := d − 1;
8 end;
9 sum := sum + S[d]; R[d] := R[d] − 1; l := S[d] − 1;
10 if R[d] > 0 then d := d + 1;
11 S[d] := l; R[d] := sum div l;
12 l := sum mod l;
13 if l ≠ 0 then
14 begin d := d + 1; S[d] := l; R[d] := 1
15 end;
16 write();
17 end
18 end
