Дужкові послідовністі — клас комбінаторних об'єктів. Будь-який представник цього класу складається з набору дужкових символів, тобто "(", «)», «[» та інших аналогічних. У дужковій послідовності може бути один або декілька типів дужок. Типом дужки називають пару фіксованих символів: відкриваючу та закриваючу дужки. Наприклад, «(1» та «)1»; «[10» та «]10». Зазвичай в комбінаториці розглядають правильні дужкові послідовності.
Правильна дужкова послідовність(ПДП) — окремий випадок дужкової послідовності. Правильні дужкові послідовності утворюють [en] та формально визначаються таким чином:
- "" (порожній рядок) - ПДП
- ПДП, взята в дужки одного типу - ПДП
- ПДП, до якої приписана зліва або справа ПДП - також ПДП
Кількість правильних дужкових послідовностей
Кількість правильних дужкових послідовностей з дужок (, що відкривають та , що закривають) одного виду дорівнює числу Каталана , що можна вивести кількома способами:
- і для
Це співвідношення легко отримати, звернувши увагу на те, що будь-яка непорожня правильна дужкова послідовність однозначно зображувана в формі , де — правильні дужкові послідовності.
- Відображення через біноміальні коефіцієнти:
- Ще одне рекурентне співвідношення:
При цьому
Легко показати, що якщо в дужковій послідовності є типів дужок, тоді кількість можливих правильних послідовностей із відкриваючими дужками дорівнює добутку та . Дійсно, для кожної дужки, що відкривається із існує різних варіантів її вибору. Вибір дужки, що закривається однозначно визначений вже вибраною парною до неї, що відкривається і не враховується.
Генерація правильних дужкових послідовностей
Введемо тепер лексикографічний порядок на дужкових послідовностях. В першу чергу зауважимо, що відкриваюча дужка іде раніше ніж закриваюча. Тепер кожному з типів дужок присвоїмо свій лексикографічний пріоритет. Вибір цього пріоритету не принциповий і ніяк не впливає на розвиток наступних міркувань. Через це будемо вважати, що iй тип дужок знаходиться на iй позиції в лексикографічному порядку. Очевидно, що першою послідовністю з відкриваючими дужками буде послідовність виду . Тепер розглянемо задачу про отримання наступної дужкової послідовності після даної.
Отримання наступної правильної послідовності
Реалізація алгоритму генерації ПДП на
#include <stdio.h> #include <memory.h> // повертає число Каталана для даної кількості пар дужок long nCatalan(int n) { long sum = 0; for (int i = 0; i <= n - 1; i++) sum += nCatalan(i) * nCatalan(n - 1 - i); return sum; } const int N = 3; // Кількість пар дужок, тобто довжина рядка (N * 2) // рекурсивно знаходить і виводить на консоль дужкові послідовності void bs(char cur_sequence[N * 2 + 1] = 0, int npos = 0, int left_brackets = 0) { if (!cur_sequence) { cur_sequence = new char[N * 2 + 1]; cur_sequence[N * 2] = 0; } if (npos == N * 2 - 1) { cur_sequence[npos] = ')'; printf("%s\n", cur_sequence); cur_sequence[npos] = 0; return; } if (npos > 0) { if (left_brackets < N) { cur_sequence[npos] = '('; bs(cur_sequence, npos + 1, left_brackets + 1); if (npos + 1 <= left_brackets * 2) { cur_sequence[npos] = ')'; bs(cur_sequence, npos + 1, left_brackets); } } else { cur_sequence[npos] = ')'; bs(cur_sequence, npos + 1, left_brackets); } } else { cur_sequence[0] = '('; bs(cur_sequence, npos + 1, left_brackets + 1); } cur_sequence[npos] = 0; } int main() { bs(); getchar(); return 0; }
Нерекурсивний варіант за допомогою бітового представлення
#include <iostream> #include <bitset> using namespace std; const int N = 10; //Кількість пар дужок //Перевантажений оператор для полегшення виводу template <size_t seq_size> ostream& operator<<(ostream& os, const bitset<seq_size>& bs) { for (size_t i = seq_size - 1; i > 0; --i) { os << (bs.test(i) ? "(" : ")"); } os << ")"; return os; } int main(int argc, char* argv[]) { const unsigned long int count = N * 2; unsigned long int base = 0; for (int i = count - 1; i >= count / 2; --i) { base += (0x1 << i); } //Перший біт повинен завжди дорівнювати 1 (послідовніть починається з відкриваючої дужки) //Крім того, після 100... немає правильних послідовностей. while ((base & (0x1 << (count - 1))) && (base > ((0x1 << (count - 1)) + (0x1 << (count - 3)) - 1))) { int sum = 0; for (int j = count - 1; (j >= 0) && (sum >= 0); --j) { if (base & (0x1 << j)) { ++sum; } else { --sum; } } if (sum == 0) { cout << bitset<count>(base) << endl; } base -= 2; } return 0; }
Зноски
- Daniel Kleitman (2004). Principles of Discrete Applied Mathematics /29. Parentheses, Catalan Numbers and Ruin (PDF). Professor Kleitman's Homepage. Процитовано 7 серпня 2023.
Це незавершена стаття з математики. Ви можете проєкту, виправивши або дописавши її. |
Вікіпедія, Українська, Україна, книга, книги, бібліотека, стаття, читати, завантажити, безкоштовно, безкоштовно завантажити, mp3, відео, mp4, 3gp, jpg, jpeg, gif, png, малюнок, музика, пісня, фільм, книга, гра, ігри, мобільний, телефон, android, ios, apple, мобільний телефон, samsung, iphone, xiomi, xiaomi, redmi, honor, oppo, nokia, sonya, mi, ПК, web, Інтернет
Duzhkovi poslidovnisti klas kombinatornih ob yektiv Bud yakij predstavnik cogo klasu skladayetsya z naboru duzhkovih simvoliv tobto ta inshih analogichnih U duzhkovij poslidovnosti mozhe buti odin abo dekilka tipiv duzhok Tipom duzhki nazivayut paru fiksovanih simvoliv vidkrivayuchu ta zakrivayuchu duzhki Napriklad 1 ta 1 10 ta 10 Zazvichaj v kombinatorici rozglyadayut pravilni duzhkovi poslidovnosti Pravilna duzhkova poslidovnist PDP okremij vipadok duzhkovoyi poslidovnosti Pravilni duzhkovi poslidovnosti utvoryuyut en ta formalno viznachayutsya takim chinom porozhnij ryadok PDP PDP vzyata v duzhki odnogo tipu PDP PDP do yakoyi pripisana zliva abo sprava PDP takozh PDPKilkist pravilnih duzhkovih poslidovnostejKilkist pravilnih duzhkovih poslidovnostej z 2n displaystyle 2n duzhok n displaystyle n sho vidkrivayut ta n displaystyle n sho zakrivayut odnogo vidu dorivnyuye chislu Katalana Cn displaystyle C n sho mozhna vivesti kilkoma sposobami Rekurentne spivvidnoshennya C0 1 displaystyle C 0 1 i Cn i 0n 1CiCn 1 i displaystyle qquad C n sum i 0 n 1 C i C n 1 i dlya n 1 displaystyle n geq 1 Ce spivvidnoshennya legko otrimati zvernuvshi uvagu na te sho bud yaka neporozhnya pravilna duzhkova poslidovnist w displaystyle omega odnoznachno zobrazhuvana v formi w w1 w2 displaystyle omega omega 1 omega 2 de w1 2 displaystyle omega 1 2 pravilni duzhkovi poslidovnosti Vidobrazhennya cherez binomialni koeficiyenti Cn 1n 1 2nn 2n n n 1 2nn 2nn 1 displaystyle C n frac 1 n 1 2n choose n frac 2n n n 1 2n choose n 2n choose n 1 She odne rekurentne spivvidnoshennya R o n 1 o 0andn 0 0 n 0oro gt noro lt 0 R o 1 n 1 R o 1 n 1 otherwise displaystyle R o n begin cases 1 amp o 0 mbox and n 0 0 amp n 0 mbox or o gt n mbox or o lt 0 R o 1 n 1 R o 1 n 1 amp mbox otherwise end cases Pri comu Cn R 0 2n displaystyle C n R 0 2n Legko pokazati sho yaksho v duzhkovij poslidovnosti ye k displaystyle k tipiv duzhok todi kilkist mozhlivih pravilnih poslidovnostej iz n displaystyle n vidkrivayuchimi duzhkami dorivnyuye dobutku Cn displaystyle C n ta kn displaystyle k n Dijsno dlya kozhnoyi duzhki sho vidkrivayetsya iz n displaystyle n isnuye k displaystyle k riznih variantiv yiyi viboru Vibir duzhki sho zakrivayetsya odnoznachno viznachenij vzhe vibranoyu parnoyu do neyi sho vidkrivayetsya i ne vrahovuyetsya Generaciya pravilnih duzhkovih poslidovnostejVvedemo teper leksikografichnij poryadok na duzhkovih poslidovnostyah V pershu chergu zauvazhimo sho vidkrivayucha duzhka ide ranishe nizh zakrivayucha Teper kozhnomu z k displaystyle k tipiv duzhok prisvoyimo svij leksikografichnij prioritet Vibir cogo prioritetu ne principovij i niyak ne vplivaye na rozvitok nastupnih mirkuvan Cherez ce budemo vvazhati sho ij tip duzhok znahoditsya na ij poziciyi v leksikografichnomu poryadku Ochevidno sho pershoyu poslidovnistyu z n displaystyle n vidkrivayuchimi duzhkami bude poslidovnist vidu 1 1 1 1 1 1 displaystyle 1 1 1 1 1 1 Teper rozglyanemo zadachu pro otrimannya nastupnoyi duzhkovoyi poslidovnosti pislya danoyi Otrimannya nastupnoyi pravilnoyi poslidovnostiRealizaciya algoritmu generaciyi PDP na S include lt stdio h gt include lt memory h gt povertaye chislo Katalana dlya danoyi kilkosti par duzhok long nCatalan int n long sum 0 for int i 0 i lt n 1 i sum nCatalan i nCatalan n 1 i return sum const int N 3 Kilkist par duzhok tobto dovzhina ryadka N 2 rekursivno znahodit i vivodit na konsol duzhkovi poslidovnosti void bs char cur sequence N 2 1 0 int npos 0 int left brackets 0 if cur sequence cur sequence new char N 2 1 cur sequence N 2 0 if npos N 2 1 cur sequence npos printf s n cur sequence cur sequence npos 0 return if npos gt 0 if left brackets lt N cur sequence npos bs cur sequence npos 1 left brackets 1 if npos 1 lt left brackets 2 cur sequence npos bs cur sequence npos 1 left brackets else cur sequence npos bs cur sequence npos 1 left brackets else cur sequence 0 bs cur sequence npos 1 left brackets 1 cur sequence npos 0 int main bs getchar return 0 Nerekursivnij variant za dopomogoyu bitovogo predstavlennya S include lt iostream gt include lt bitset gt using namespace std const int N 10 Kilkist par duzhok Perevantazhenij operator dlya polegshennya vivodu template lt size t seq size gt ostream amp operator lt lt ostream amp os const bitset lt seq size gt amp bs for size t i seq size 1 i gt 0 i os lt lt bs test i os lt lt return os int main int argc char argv const unsigned long int count N 2 unsigned long int base 0 for int i count 1 i gt count 2 i base 0x1 lt lt i Pershij bit povinen zavzhdi dorivnyuvati 1 poslidovnit pochinayetsya z vidkrivayuchoyi duzhki Krim togo pislya 100 nemaye pravilnih poslidovnostej while base amp 0x1 lt lt count 1 amp amp base gt 0x1 lt lt count 1 0x1 lt lt count 3 1 int sum 0 for int j count 1 j gt 0 amp amp sum gt 0 j if base amp 0x1 lt lt j sum else sum if sum 0 cout lt lt bitset lt count gt base lt lt endl base 2 return 0 ZnoskiDaniel Kleitman 2004 Principles of Discrete Applied Mathematics 29 Parentheses Catalan Numbers and Ruin PDF Professor Kleitman s Homepage Procitovano 7 serpnya 2023 Ce nezavershena stattya z matematiki Vi mozhete dopomogti proyektu vipravivshi abo dopisavshi yiyi