Рецидиви та генеруючі функції в алгоритмах


18

Комбінаторика відіграє важливу роль в інформатиці. Ми часто використовуємо комбінаторні методи як в аналізі, так і в дизайні в алгоритмах. Наприклад, один із способів пошуку кришки к -вершини, встановленого у графі, може просто перевірити всі можливі підмножини . У той час як біноміальні функції зростають експоненціально, якщо - деяка фіксована константа, ми закінчуємо алгоритмом поліноміального часу шляхом асимптотичного аналізу.(нк)к

Часто проблеми з реальним життям вимагають складніших комбінаторних механізмів, які ми можемо визначити з точки зору рецидивів. Одним з відомих прикладів є послідовність покладок (наївно) визначених як:

f(н)={1якщо н=10якщо н=0f(н-1)+f(н-2)інакше

Тепер обчислення значення н го терміна зростає експоненціально, використовуючи цей повтор, але завдяки динамічному програмуванню ми можемо обчислити його в лінійний час. Зараз, не всі рецидиви піддаються DP (від руки, факторіальна функція), але це потенційно експлуатаційна властивість при визначенні деякого рахунку як повторності, а не генеруючої функції.

Формування функцій - це елегантний спосіб формалізувати деяку кількість для даної структури. Мабуть, найвідомішою є функція генерування бінома, визначена як:

(х+у)α=к=0(αк)хα-кук

На щастя, це має рішення закритої форми. Не всі функції генерації дозволяють настільки компактно описувати.

Тепер моє запитання таке: як часто генерують функції, що використовуються при розробці алгоритмів? Неважко зрозуміти, як вони можуть бути використані для розуміння швидкості зростання, необхідної алгоритмом за допомогою аналізу, але що вони можуть сказати нам про проблему при створенні методу вирішення якоїсь проблеми?

Якщо багато разів однаковий підрахунок може бути переформульований у вигляді повторення, він може піддатися динамічному програмуванню, але, можливо, знову ж функція генерування має закриту форму. Так воно не так рівномірно ріжеться.


Якщо функція генерування дає формулу (наприклад, формулу Біне для чисел поля), яка може бути використана для обчислення числа замість використання повторення (можливо, більш ефективно), чи вважаєте ви це відповіддю?
Ар'ябхата

Відповіді:


11

Функції генерації корисні при розробці алгоритмів підрахунку. Тобто, не тільки коли ви шукаєте кількість об'єктів, що мають певну властивість, але і коли ви шукаєте спосіб перерахувати ці об’єкти (і, можливо, створити алгоритм для підрахунку об'єктів). Є дуже гарна презентація у главі 7 конкретної математики Рональда Грема, Дональда Кнута та Орена Паташника . Наведені нижче приклади - з цих книг (помилки та неясність - це мої).

Припустимо, ви шукаєте способи внесення змін із заданим набором монет. Наприклад, із поширеними номіналами США¹ можливі монети . Щоб дати ¢ 42 у зміні, одна з можливостей є [ 25 ] [ 10 ] [ 5 ] [ 1 ] [ 1 ] ; інша можливість - [ 10 ] [ 10 ] [ 10[1],[5],[10],[25],[100][25][10][5][1][1] . Ми писатимемо 42 [ 25 ] [ 10 ] [ 5 ] [ 1 ] 2= [ 10 ] 4 [ 1 ] 2 . Більш загально, ми можемо записати формуючу функцію для всіх способів зміни змін: H = h 0 q 0 d 0 [10][10][10][10][1][1]42[25][10][5][1]2=[10]4[1]2 Більш технічно,H- термін у просторі рядів потужності над п’ятьма змінними[100],[25],[10],[5],[1]. Визначте значення мономера в цьому просторі за допомогою

H=h0q0d0n0p0[100]h[25]q[10]d[5]n[1]p
H[100],[25],[10],[5],[1] Тоді способів дати v центів зміни є число одночленним оцінка яких v . Ми можемо виражати Н поступово, спочатку записуючи шляхи P, щоб змінити лише копійки, а потім N
[100]h[25]q[10]d[5]n[1]p=100h+25q+10d+5n+p
vvHPNдати зміни в копійках і нікелях тощо. ( увазі відсутність монети.) P = I + [ 1 ] + [ 1 ] 2 + [ 1 ] 3 + = II Якщо ви хочете порахувати, а не просто перерахувати способи зміни, то існує простий спосіб використовувати отриманий нами офіційний ряд. Застосовуйте гомоморфізм S:
P=I+[1]+[1]2+[1]3+=II[1]N=(I+[5]+[5]2+[5]3+)P=PI[5]D=(I+[10]+[10]2+[10]3+)N=NI[10]Q=(I+[25]+[25]2+[25]3+)D=DI[25]H=(I+[100]+[100]2+[100]3+)Q=QI[100]
Коефіцієнт X v в S ( C ) - це кількість способів надання v центів змін.
S:[1]Х,[5]Х5,[10]Х10,[25]Х25,[100]Х100
ХvS(С)v

Більш складний приклад: припустимо, що ви хочете вивчити всі способи плитки прямокутників доміно 2 × 1. Наприклад, є два способи плитки прямокутника розміром 2 × 2, або з двома горизонтальними доміно, або з двома вертикальними доміно. Підрахувати кількість способів плитки прямокутника досить просто, але справа 3 × n швидко стає непомітною. Ми можемо перерахувати всі можливі нахили горизонтальної смуги висотою 3 шляхом склеювання доміно, що швидко дає повторювані візерунки: { U = o + L V + Γ Λ + U V = I2×н3×н де кумедні форми являють собою елементарні доміно-композиції:o- не доміно,L- вертикальне доміно зверху лівої частини горизонтального доміно,

{U=о+LV+ΓΛ+UV=ЯU+=-VΛ=ЯU+-=Λ
оL - вертикальне доміно, вирівняне внизу смуги висотою 3,Я - горизонтальне доміно, вирівняне з вершиною смуги плюс два горизонтальних доміно під ним та один крок праворуч тощо. Тут множення являє собою горизонтальне конкатенацію і не є комутативним, але між елементарними візерунками, що утворюють змінні, є рівняння у цій силовій серії. Як і раніше з монетами, ми можемо замінитиXдля кожного доміно і отримати генеруючий ряд для кількості нахилівпрямокутника3×(2n/3)(тобто коефіцієнтX3k- кількість способів плитки a прямокутник площею6к, який містить3к-=Х3×(2н/3)Х3к6к3к2к

Знову читайте Конкретну математику для менш поспішної презентації.

¹ я знаю, що мій список неповний; Припустимо , спрощена США підходить для математичного examples.²
² Крім того , якщо мова йде вгору, припустимо , сферичні монети.
³ І краще набір.


8

Я пам’ятаю проблему, яку мені довелося вирішити під час конкурсу студентського програмування в 2001 році. Проблема була в цій:

Враховуючи маси 1, 7, 13, ... (я не пам'ятаю, які маси, але був кінцевий, визначений набір мас), спроектуйте функцію, яка визначає, чи можна зважити дану вагу за шкалою з цим набір мас.

Я почав із вкладених петель, але швидко потрапив у стіну. Тоді я зрозумів, що я повинен почати з перерахування того, що можна зробити з легшими масами, перш ніж продовжувати з більш важкими. Я міг би вирішити проблему з безліччю неперев’язаних петель.

Якби в той час я не був молодіжно зухвалим і самодостатнім (і коли б я знав про та практикував генерувати функції), я міг би визначити проблему з генеруючими функціями як такими:

Визначте f(х) як OGF для кількості способів, що важать н можна зважити, враховуючи набір мас.

Яку вагу на правій сковороді я можу зважити, даючи одну масу 1?

Три можливості:

  • Якщо я покладу масу на ліву сковороду, я можу зважити 1.
  • Якщо покласти масу на праву сковороду, я можу зважити -1.
  • Якщо я не використовую масу, я можу зважити 0.

Отже, є один спосіб зважування -1, один спосіб зважування 0, і один спосіб зважування 1. Функція генерування цієї маси є чимось подібнимх-1+1+х, що відповідає:

1-х3х(1-х)

Функція генерування для однієї маси м є х-м+1+хм, який є :

1-х3мхм(1-хм)

Дано мультисети М мас, f виражається як добуток єдиних функцій генерування маси:

f(х)=мМ(1-х3м)хмМммМ(1-хм)

Тепер, враховуючи пакет, який може виконувати операції над поліномами, вам просто потрібно:

  • Обчисліть обидва продукти.
  • Виконайте поділ цих продуктів, починаючи з найнижчого ступеня. (який припиняється)
  • Зсунь многочлен (евклідовий поділ на хк, зберігаючи показник і скидаючи решту)

І ви закінчили. Тепер ваш многочлен має кількість способів зважуванняш0 по індексу ш. Єдиний вхід - це багатонабірність масМ.

Я розробив алгоритм, використовуючи математично обгрунтовані компоненти. Основна частина алгоритму, що представляє собою поліноміальний поділ спочатку з найнижчим ступенем, є лінійною і може бути реалізована за допомогою пакету, який не використовується на полиці. Це може бути не оптимально, але, безумовно, працює краще, ніж те, що я робив на змаганнях, і менш схильним до помилок.

Якщо ви уважно подивитесь на процес поділу, ви швидко побачите, що залишок може розглядатися як "поточний прихований стан" у кожному стані процесу, а коефіцієнт - як результат. Процес закінчується, коли «поточний прихований стан» всюди досягає нуля.

Ви можете реалізовувати поліноми як масиви або, якщо вони дійсно рідкі, як упорядковані списки з коефіцієнтом індексу, і це не змінить алгоритм.


3

Розробляючи алгоритм монотонної субмодулярної максимізації над матроїдом, нам довелося вирішити рецидив

γ+1(м)=(2-м)γ(м)+(м-+1)γ-1(м),γ0(м)=1,γм+1(м)=е.
Помітивши це γ(м)=м(γ(м-1)-γ-1(м-1)), ми звели проблему до обчислення деякої універсальної послідовності γ(0). Останнє було виконано за допомогою функцій генерації, і звідти ми отримали чітку формулу дляγ(м), знову з використанням функцій генерації. Ви можете знайти рішення в папері, якщо вам цікаво, хоча ми ніколи не намагалися включити цю деривацію.

0

Мабуть, найяскравіший приклад - широкомасштабне дослідження Кіксорса та його безліч варіантів. Там комбінаторні міркування регулювали розгляд альтернатив, а аналіз розв’язків досить складних рівнянь показує переваги продуктивності (чи ні) їх.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.