
О.О.П / ооп / 4_кол / К курсовой / Методи побудови алгоритмів та їх аналіз. Караванова Т.П. / 1-23
.PDF
|
О 1 0 • 1, В, 1 0.1 |
||||
і ї і 1 0 0 1 1 |
ЕЛЕМЕНТИ КОМБІНАТОРИКИ |
||||
0 0 1 * 0 1 1 0 1 9 |
|||||
|
10 0 1 |
0 111 |
|
||
0 0 0 |
0 110 |
В АЛГОРИТМІЧНИХ ЗАДАЧАХ |
|||
І |
0 1 1 1 0 0 |
|
|
||
|
і 0 1 0,8 |
10 1 |
|
||
0 0 1 |
10 10 0 1 |
|
|||
0 0 ( 1 1 0 1 1 |
|
||||
10 11 |
0 |
0 |
1 |
|
|
0 |
0 0 |
|
1 |
|
|
1 |
0 |
|
1 |
|
|
Основні поняття комбінаторики
Комбінаторика - це наука, яка вивчає способи вибору та розміщення елементів деякої скінченної множини. Серед по нять комбінаторики розглядають наступні.
Перестановки - упорядковані послідовності всіх елементів заданої множини, в яких кожний елемент зустрічається лише один раз.
Розміщення - послідовності довжини М, утворені з N різних елементів заданої множини.
Сполучення - М-елементні підмножини будь-якої множини з N елементів (наприклад, у множини {а, Ь, с} є 3 двоелементні підмножини: {а, Ь), {а, с), {Ь, с}, причому {а, Ь} та {Ь, а} -
однакові сполучення).
Під час розв'язування практичних задач часто доводиться спиратися саме на базові поняття комбінаторики, використову ючи їх під час складання алгоритмів: вибирати певну кількість елементів з деякої скінченної множини елементів, що мають ті чи інші властивості, визначати усі можливі підмножини еле ментів, розміщувати елементи множин у певному порядку то що. Такі задачі називаються комбінаторними.
Наведемо кілька прикладів. Як визначити, які існують ва ріанти розміщення N учнів у класі, де є N місць? А які існують варіанти запрошення N знайомих у гості, якщо у вашій віталь ні є лише М місць (N > М)? Як визначити, які існують варіан ти фарбування М різними кольорами паркану, що складається з N дощок?
Існують формули, за допомогою яких можна підрахувати кількість комбінацій відповідних елементів комбінаторики. Так, кількість перестановок з iV елементів підраховується за
Формулою PN ~ N1, кількість |
|
|
|
|
ї ї |
ЛП |
|
розміщень - Ад |
|
||||||
Ам |
|
N\ |
|
|
(N-M)l' |
||
кількість сполучень - С5 =—— = |
|
|
— |
|
. |
|
|
|
|
|
|||||
|
|
|
|
|
|||
Рм |
M\(N-M)l |
|
21
У цьому розділі ми з вами ознайомимося лише з окремими елементами комбінаторики, що стосуються визначення та підрахунку кількості певних елементів підмножин з усієї зада ної кінцевої множини елементів і найчастіше використовують ся під час розв'язування алгоритмічних задач. Розглядати ці питання ми будемо лише стосовно побудови алгоритмів, що розв'язують поставлену задачу.
В алгоритмізації існує достатньо задач, розв'язок яких ле жить суто у площині комбінаторики. Однак є і багато інших за дач, які використовують комбінаторні елементи як фрагмент складніпіого алгоритму. Це говорить про те, що матеріал цього розділу ми будемо використовувати неодноразово й у подаль ших розділах посібника.
Перестановки
Під час розгляду перестановок (permutation) нас цікавитиме не тільки кількість усіх можливих варіантів перестановок N різних предметів, розташованих на N різних місцях, а і генерування самих цих перестановок. Наприклад, для множини S = {а, Ь, с] існує 6 таких перестановок: abc, acb, bac, bca, cab, cba.
Як зазначалося вище, кількість перестановок обчислюється за формулою PN = ЛП. Цю формулу нескладно отримати за допо могою таких міркувань. Пронумеруємо наші елементи від 1 до N. На скількох місцях може знаходитись елемент під номе ром 1? Звісно, що на ЛГ місцях. Для решти елементів у нас зали шилося вільних (N - 1) місць. Тому елемент під номером 2 мо же бути розміщений вже тільки на (N - 1) місці. Загальна кіль кість розташувань цих двох елементів становить N * (N - 1). Аналогічно для елемента під номером 3 залишилось для розміщення лише (N - 2) місця, а загальна кількість розміщен ня цих трьох елементів на N місцях буде N * {N - 1) * (N - 2)і т. д. У результаті отримаємо наведену на початку формулу для обчислення кількості перестановок ЛГ елементів на N місцях:
PN = N * (N - 1) * (N - 2) * ... * 2 * 1 = Ж.
Якщо поставлена задача вимагає підрахунку кількості мож ливих перестановок N елементів, то вона розв'язується дуже просто: достатньо запрограмувати обчислення значення N1. Од нак ми вже знаємо, що при цьому навіть для не дуже великих значень N результат виходить за межі стандартних типів змінних мови програмування й у такому разі необхідно засто совувати довгу арифметику.
А якщо сформульована інша задача і необхідно визначити не кількість перестановок, а самі перестановки, тобто всі варіанти розміщення ЛГ елементів на N місцях? Саме таку задачу і будемо надалі розв'язувати.
22
Введемо поняття лексикографічного порядку перестановок.
Лексикографічний порядок на множині всіх перестановок визначається таким чином. Кажуть, що Р\ < Р2 тоді і тільки тоді, коли існує таке £>•!, що Pl[t] < P2[t] та Р1[і] = Р2[і] для всіх і < t.
Наведемо приклад. Між словами «алгол» та «алгоритм» існує такий лексикографічний порядок: алгол < алгоритм, оскільки для t = 5 (Р1[5] = л, Р2[5] = р) справедливі відношення Pl[t] < P2[t], Р1[і] = Р2[і] для і = 1,2,...,4.
Під час розв'язування задачі на визначення всіх пере становок розв'язується власне задача для отримання на кожно му кроці наступної за лексикографічним порядком пере становки. У такому разі, розташувавши у лексикографічному порядку всі задані елементи від початкового стану «за зростан ням» до кінцевого стану «за спаданням», отримаємо всі мож ливі варіанти їх перестановок.
Наведемо приклад. Нехай множина значень має початковий вигляд: 123. Відповідно до лексикографічного порядку наступ ним за зростанням буде число 132, оскільки Р1[1] = Р2[1], а Р1[2] < Р2[2]. Запишемо всю лексикографічну послідовність: 123 < 132 < 213 < 231 < 312 < 321.
Тепер можемо зробити висновок, що задача на визначення всіх можливих перестановок перетворюється на задачу про ви значення наступного значення у лексикографічному порядку.
Розглянемо спочатку логіку побудови алгоритму. Почнемо з визначення початкового стану заданої множини елементів. Не хай це буде послідовність елементів, розташованих за зростан ням (мал. 1, а). Перебравши усі можливі варіанти розташуван ня її елементів, ми маємо прийти до варіанта їх розташування за спаданням.
За яким же алгоритмом будувати всі проміжні варіанти? Можна запропонувати такий.
Будемо розглядати праві фрагменти заданої послідовності і намагатися покроково упорядковувати їх за спаданням. Спо чатку розглянемо лише перший справа елемент. Чи стоїть він на своєму місці? Так, оскільки підпослідовність з одного еле мента є спадною. Це означає, що цей фрагмент послідовності задовольняє вимоги кінцевого стану.
Тепер розширимо поточний фрагмент підпослідовності, підключивши до нього попередній елемент, той, що розташова ний зліва (мал. 1, б). Новий елемент не задовольняє вимоги кінцевого стану, до якого ми прагнемо. Це означає, що він стоїть не на своєму місці. Зафіксуємо положення цього елемен та, визначивши його як граничне. Таким чином, на поточний Момент граничним елементом, що порушив спадання правої Частини послідовності, є 6-й елемент. Тут слід зауважити, що
23