Рецидивы и генерация функций в алгоритмах


18

Комбинаторика играет важную роль в информатике. Мы часто используем комбинаторные методы как в анализе, так и в алгоритмах. Например, один из методов нахождения покрытия графа вершины в графе может просто проверить все \ binom {n} {k} возможных подмножеств. В то время как биномиальные функции растут экспоненциально, если k является некоторой фиксированной константой, мы получаем алгоритм полиномиального времени с помощью асимптотического анализа.К к(NК)К

Часто реальные проблемы требуют более сложных комбинаторных механизмов, которые мы можем определить с точки зрения повторений. Один известный пример - последовательность Фибоначчи (наивно), определенная как:

е(N)знак равно{1если Nзнак равно10если Nзнак равно0е(N-1)+е(N-2)в противном случае

Теперь вычисление значения N го члена растет экспоненциально с использованием этого повторения, но благодаря динамическому программированию мы можем вычислить его за линейное время. Теперь, не все рецидивы поддаются DP (от руки, факториальная функция), но это потенциально эксплуатируемое свойство при определении некоторого количества как рекуррентности, а не производящей функции.

Генерация функций - это элегантный способ формализовать некоторый счет для данной структуры. Возможно, самой известной является биноминальная производящая функция, определяемая как:

(Икс+Y)αзнак равноΣКзнак равно0(αК)Иксα-КYК

К счастью, это решение в закрытой форме. Не все производящие функции допускают такое компактное описание.

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

Если много раз один и тот же счет может быть переформулирован как повторение, он может использоваться для динамического программирования, но, опять же, возможно, одна и та же генерирующая функция имеет закрытую форму. Так что это не так равномерно.


Если производящая функция дает формулу (например, формулу Бине для чисел Фибоначчи), которую можно использовать для вычисления числа вместо использования повторения (возможно, более эффективно), считаете ли вы это ответом?
Арьябхата

Ответы:


11

Генерация функций полезна при разработке алгоритмов подсчета. То есть не только когда вы ищете количество объектов, имеющих определенное свойство, но и когда вы ищете способ перечислить эти объекты (и, возможно, сгенерировать алгоритм для подсчета объектов). В главе 7 « Конкретной математики » есть очень хорошая презентация Рональда Грэма, Дональда Кнута и Орен Паташник . Приведенные ниже примеры взяты из этих книг (ошибки и отсутствие ясности - мои).

Предположим, что вы ищете способы внести изменения с помощью данного набора монет. Например, с обычными номиналами в США¹ возможны монеты . Чтобы дать ¢ 42 в изменении, одна возможность - ; другая возможность - . Мы напишем . В более общем смысле, мы можем написать производящую функцию для всех способов изменения: В более технических терминах - это термин в пространстве степенных рядов над пятью переменными[ 25 ] [ 10 ] [ 5 ] [ 1 ] [ 1 ] [ 10 ] [ 10 ] [ 10 ] [ 10 ] [ 1 ] [ 1 ] 42 [ 25 ] [ 10 ][1],[5],[10],[25],[100][25][10][5][1][1][10][10][10][10][1][1]Н = Σ ч 0 Σ Q 0 Σ d 0 Σ п 0 Σ р 0 [ 100 ] ч [ 25 ] д [ 10 ] d [ 5 ] n [ 1 ] p42[25][10][5][1]2знак равно[10]4[1]2

ЧАСзнак равноΣчас0ΣQ0Σd0ΣN0Σп0[100]час[25]Q[10]d[5]N[1]п
[ 100 ] , [ 25 ] , [ 10 ] , [ 5 ] , [ 1 ] [ 100 ] ч [ 25 ] д [ 10 ] d [ 5 ] п [ 1 ] р= 100 ч + 25 кв + 10 d + 5 n + p v v H PЧАС[100],[25],[10],[5],[1], Определите оценку монома в этом пространстве как Тогда способы дать центов в изменении - это количество мономов, оценка которых . Мы можем выразить в инкрементной форме, сначала записав способы чтобы дать изменение только в копейках, затем способы чтобы дать изменение в пенни и никелях, и так далее. ( виду нет монеты.)
[100]час[25]Q[10]d[5]N[1]пзнак равно100час+25Q+10d+5N+п
vvЧАСпI P = I + [ 1 ] + [ 1 ] 2 + [ 1 ] 3 + = INя
пзнак равноя+[1]+[1]2+[1]3+...знак равнояя-[1]Nзнак равно(я+[5]+[5]2+[5]3+...)пзнак равнопя-[5]Dзнак равно(я+[10]+[10]2+[10]3+...)Nзнак равноNя-[10]Qзнак равно(я+[25]+[25]2+[25]3+...)Dзнак равноDя-[25]ЧАСзнак равно(я+[100]+[100]2+[100]3+...)Qзнак равноQя-[100]
Если вы хотите сосчитать, а не просто перечислить способы внесения изменений, то существует простой способ использования полученных формальных рядов. Примените гомоморфизм коэффициент в представляет количество способов дать центов в смену.
S:[1]Икс,[5]Икс5,[10]Икс10,[25]Икс25,[100]Икс100
ИксvS(С)v

Более сложный пример: предположим, что вы хотите изучить все способы разбиения прямоугольников на 2 × 1 домино. Например, существует два способа наложить прямоугольник 2 × 2, либо с двумя горизонтальными домино, либо с двумя вертикальными домино. Подсчет количества способов разбить прямоугольник довольно прост, но случай быстро становится неочевидным. Мы можем перечислить все возможные наклоны горизонтальной полосы высотой 3, склеив домино вместе, что быстро дает повторяющиеся шаблоны: 2×N3×N

{Uзнак равноо+LВ+ΓΛ+UВзнак равнояU+знак равно-ВΛзнак равнояU+-знак равноΛ
где забавные фигуры представляют элементарные композиции домино: - не домино, - вертикальное домино на вершине левой части горизонтального домино, - это вертикальное домино, выровненное по низу полосы высотой 3, - это горизонтальное домино, выровненное по верху полосы, плюс два горизонтальных домино под ним и один шаг вправо, и т. д. Здесь умножение представляет горизонтальную конкатенацию и не является коммутативным, но между элементарными образцами, которые образуют переменные в этом степенном ряду, существуют уравнения. Как и раньше с монетами, мы можем заменить для каждого домино и получить серию генерации для числа бросковоLя-знак равноИкс3×(2N/3)Прямоугольник (т. Е. Коэффициент - это количество способов разбить прямоугольник площадью , который содержит домино и имеет ширину ). Эта серия также может использоваться более универсально; например, различая вертикальное и горизонтальное домино, мы можем подсчитать размеры мозаики с заданным количеством вертикальных и горизонтальных домино.Икс3К6К3К2К

Снова, прочитайте Конкретную Математику для менее спешащего представления

¹ Я знаю , что мой список является неполным; предположим, что для математических примеров используется упрощенный метод США.
² Кроме того, если это подходит, предположим, что сферические монеты.
³ И лучше набрать текст.


8

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

Учитывая массы 1, 7, 13, ... (я не помню, какие массы, но был конечный, определенный набор масс), разработайте функцию, которая определяет, может ли данный вес быть взвешен в масштабе с этим набор масс.

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

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

Определите как OGF для количества способов, которым вес может быть взвешен, учитывая набор масс.е(Икс)N

Какой вес на правой чашке я могу весить, учитывая одну массу 1?

Три возможности:

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

Таким образом, существует один способ взвешивания , один способ взвешивания и один способ взвешивания . Производящая функция для этой массы имеет вид , что соответствует:-101Икс-1+1+Икс

1-Икс3Икс(1-Икс)

Производящая функция для одной массы имеет вид , который равен:мИкс-м+1+Иксм

1-Икс3мИксм(1-Иксм)

Для заданного мультимножества масс выражается как произведение функций, генерирующих одну массу:Mе

е(Икс)знак равноΠмM(1-Икс3м)ИксΣмMмΠмM(1-Иксм)

Теперь, учитывая пакет, который может выполнять операции над полиномами, вам просто нужно:

  • Рассчитайте оба продукта.
  • Выполните разделение этих продуктов, начиная с самой низкой степени. (который заканчивается)
  • Сдвиньте полином (евклидово деление на , сохраняя частное и сбрасывая остаток)ИксК

И вы сделали. Теперь у вашего полинома есть множество способов взвешивания по индексу . Только вход является мультимножеством масс .вес0весM

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

Если вы внимательно посмотрите на процесс деления, вы быстро увидите, что остаток можно рассматривать как «текущее скрытое состояние» в каждом состоянии процесса, а частное - как результат. Процесс завершается, когда «текущее скрытое состояние» везде достигает нуля.

Вы можете реализовать полиномы как массивы или, если они действительно очень редки, как упорядоченные списки с индексным коэффициентом, и это не изменит алгоритм.


3

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

γ+1(м)знак равно(2-м)γ(м)+(м-+1)γ-1(м),γ0(м)знак равно1,γм+1(м)знак равное,
γ(м)знак равном(γ(м-1)-γ-1(м-1))γ(0)γ(м)

0

Возможно, самым ярким примером является обширное изучение быстрой сортировки и ее многочисленных вариантов. Там комбинаторные соображения регулировали рассмотрение альтернатив, и анализ решений довольно сложных уравнений показывает преимущества производительности (или нет) из них.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.