Решение или аппроксимация рекуррентных отношений для последовательностей чисел


90

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

Примеры

  1. Время выполнения хвостовой рекурсивной функции, понижающейся до от чье тело занимает время :0nf(n)

    T(0)=0T(n+1)=T(n)+f(n)

  2. Последовательность Фибоначчи :

    F0=0F1=1Fn+2=Fn+Fn+1

  3. Количество слов Дика с парами скобок:n

    C0=1Cn+1=i=0nCiCni

  4. Периодичность выполнения слияния в списках длины :n

    T(1)=T(0)=0T(n)=T(n/2)+T(n/2)+n1

Каковы методы решения рецидивирующих отношений? Мы ищем

  • общие методы и
  • методы для значительного подкласса

также как и

  • методы, которые дают точные решения и
  • методы, которые обеспечивают (ограничивают) асимптотический рост.

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


9
Эти заметки могут быть полезны. (Но нет, я не буду транскрибировать их в ответы.)
Джефф

Ответы:


35

Преобразование полной истории в ограниченную историю

Это первый шаг в решении повторений, когда значение любого целого числа зависит от значений всех меньших целых чисел. Рассмотрим, например, рекуррентность которая возникает в анализе рандомизированной быстрой сортировки . (Здесь - ранг случайно выбранного стержня.) Для любого целого числа значение зависит от всех с . Повторения этой формы называются повторениями полной истории .knT(n)T(k)k<n

T(n)=n+1nk=1n(T(k1)+T(nk))
knT(n)T(k)k<n

Чтобы решить это повторение, мы можем преобразовать его в ограниченное повторение истории , где зависит только от постоянного числа предыдущих значений. Но сначала это помогает немного упростить повторение, собрать общие термины и устранить неприятные дроби. Теперь для преобразования в рекурсию с ограниченной историей мы записываем рекуррентность для , вычитаем и повторяем термины: n T ( n )T(n) T(n-1) ( n - 1 ) T ( n - 1 )

nT(n)=n2+2k=1n1T(k)
T(n1)
(n1)T(n1)=(n1)2+2k=1n2T(k)nT(n)(n1)T(n1)=(2n1)+2T(n1)nT(n)=(2n1)+(n+1)T(n1)T(n)n+1=2n1n(n+1)+T(n1)n

Теперь, если мы определим и заменим дробь более простой асимптотикой мы получаем гораздо более простую рекуррентность Разложение этого повторения в сумму немедленно дает нам , где - номер й гармоники . Мы заключаем, что .2 n - 1t(n)=T(n)/(n+1) Θ(1/n)t(n)=Θ(1/n)+t(n-1). t(n)=Θ(Hn)=Θ(logn)Hnn2n1n(n+1)Θ(1/n)

t(n)=Θ(1/n)+t(n1).
t(n)=Θ(Hn)=Θ(logn)HnnT(n)=Θ(nlogn)

1
Если вам нужно точное решение для , это тоже не сложно (здесь), если немного утомительно; получаем . На самом деле, смущает меня, поэтому я предпочитаю точный вариант. Пески суммы терминов Ландау . Т ( п ) = 2 ( п + 1 ) Н п + ( Т ( 0 ) - 3 ) п + Т ( 0 ) Σ п я = 1 Θ ( 1 / я ) = Θ ( Н п )TT(n)=2(n+1)Hn+(T(0)3)n+T(0)i=1nΘ(1/i)=Θ(Hn)
Рафаэль

На самом деле, достаточно заметить (индуктивно), что , где . Фактически, я уже использовал этот трюк в самом начале, когда заменил время для разбиения массива на более простое . Это совершенно стандартное злоупотребление нотацией. t ( n ) = 1 / n + t ( n - 1 ) Θ ( n ) nT(n)/(n+1)=Θ(t(n))t(n)=1/n+t(n1)Θ(n)n
Джефф

28

Генерация функций

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

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

Метод

Пусть серия чисел. Тогда формальные степенные ряды(an)nN

A(z)=n=0anzn

является обычной производящей функцией ¹ of . Коэффициенты в разложении в ряд равны последовательности, т.е. . Например, обычная производящая функция известных каталонских чисел имеет вид(an)nNA(z)[zn]A(z)=an Cn

C(z)=114z2z .

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

a0=c0ak1=ck1an=f(n)+i=1kbiani,nk

для некоторых фиксированных и - функция, независимая от всех . Теперь мы просто вставляем в анзац и якоря, и рекурсивную часть, то естьb1,,bkRf(n):NNai

A(z)=n=0anzn=c0z0+c1z1++ck1zk1+n=k[f(n)+(i=1kbiani)]zn

Используя механику манипулирования суммой, свойства формальных степенных рядов и известные тождества ², последняя правая часть должна быть приведена в замкнутые формы, обычно в терминах . Полученное уравнение (часто) может быть решено для . Последовательное расширение результата (который может быть легко получен, известен или иным образом доступен) по существу является решением.A(z)A(z)

Хорошие введения можно найти в книге Уилфа [3] и в GKP [4]. Усовершенствованный материал был собран Фальоулетом и Седжвиком [5].

пример

Рассмотреть возможность

a0=1a1=2an=5n+3an12an2,n>1

Мы рассчитываем:

A(z)=n=0anzn=1+2z+n=2[3an12an2+5n]zn=1+2z+3n=2an1zn2n=2an2zn+5n=2nzn=1+2z+3zn=1anzn2z2n=0anzn+5n=2nzn=1+2z+3z(A(z)a0)2z2A(z)+5(z(1z)2z)=16z+(3z2z2)A(z)+5z(1z)2

Это решает

A(z)=13z+13z26z3(12z)(1z)3=1612z51z5(1z)25(1z)3=16n=02nzn5n=0zn5n=0(n+1)zn5n=0(n+1)(n+2)2zn

Теперь мы можем наконец прочитать

an=162n55(n+1)52(n+1)(n+2)=2n+452n2252n15

Как только вы привыкнете к этому , вы заметите, что все это довольно механично. Фактически, компьютерная алгебра может сделать все это за вас во многих случаях. Хорошо, что механика остается (более или менее) такой, даже если повторение более сложное. Смотрите здесь для более сложного, менее механического примера.

Также обратите внимание, что общие методы также работают, если искомые объекты являются комплексными числами или даже полиномами.

Ярлык

Для линейных и однородных повторений, т. Е. Такого вида

a0=c0ak1=ck1an=i=1kbiani,nk

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

zkb1zk1b2zk2bk

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

an=i=1lj=1ribi,jnj1λin

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

асимптотике

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

Можно использовать сложный механизм анализа, в частности, анализ сингулярностей, чтобы получить асимптотику для коэффициентов; Ключевые слова включают метод Дарбу и метод седловой точки. Они основаны на теореме вычетов и интегральной формуле Коши . Смотрите [6] для деталей.


  1. Вы можете делать подобные вещи с экспонентой , Дирихле и некоторыми другими производящими функциями. Что работает лучше всего, зависит от последовательности и, в частности, от того, найдете ли вы необходимые закрытые формы.
  2. Например, из Шпаргалки TCS или [3].
  3. Генерирующая функциональность Х. Уилфа (1994, 2-е изд.) - доступна для бесплатного скачивания
  4. Конкретная математика Р. Л. Грэма, Д. Е. Кнута и О. Паташника (1994, 2-е изд.)
  5. Введение в анализ алгоритмов Р. Седжвика и П. Флажолета (2-е издание, 2013) - доступно для бесплатной загрузки
  6. Аналитическая комбинаторика P. Flajolet и R. Sedgewick (2009) - доступна для бесплатного скачивания

21

Основная теорема

Основная теорема дает асимптотику для решений так называемых повторений « разделяй и властвуй» , то есть таких, которые делят их параметр на пропорциональные порции (вместо того, чтобы обрезать константы). Они обычно возникают при анализе (рекурсивных) алгоритмов «разделяй и властвуй», отсюда и название. Теорема популярна, потому что ее часто невероятно легко применять. С другой стороны, его можно применять только к повторениям следующей формы:

T(n)=aT(nb)+f(n)

с . Есть три случаяa1,b>1

  1. fO(nlogb(a)ε)

    для некоторого ;ε>0

  2. fΘ(nlogbalogkn) ,

    для некоторого ;k0

  3. fΩ(nlogb(a)+ε)

    для некоторого иε>0

    af(nb)cf(n)

    для некоторых и .c<1n

что подразумевает асимптотику

  1. TΘ(nlogba) ,
  2. TΘ(nlogbalogk+1n) и
  3. TΘ(f) ,

соответственно. Обратите внимание, что базовые случаи здесь не указаны или не используются; это имеет смысл, учитывая, что мы исследуем только асимптотическое поведение. Мы молча предполагаем, что они являются некоторыми константами (что еще они могут быть. Какие константы, которые мы не видим, не имеют значения, все они исчезают в .Θ

Примеры

  1. Рассмотрим повторение

    T(n)=4T(n3)+n .

    С и - обратите внимание, что мы видим, что первый случай применяется с . Следовательно, .f(n)=n,a=4b=3logba1.26ε=0.25TΘ(nlog34)=Θ(n1.261)

  2. Рассмотрим повторение

    T(n)=2T(n/2)+n .

    При и - обратите внимание, что мы видим, что второй случай применяется с . Следовательно, .f(n)=n,a=2b=2logba=1k=0TΘ(nlogn)

  3. Рассмотрим повторение

    T(n)=3T(n4)+n .

    При и - обратите внимание, что мы видим, что третий случай применим при и . Следовательно, .f(n)=n,a=3b=4logba0.79ε=0.2c=1TΘ(n)

  4. Рассмотрим повторение

    T(n)=16T(n4)+n!

    Здесь мы имеем , и- во многих стандартных примерах будет многочлен , но это не правило. У нас есть , и третий случай применяется снова. В этом случае, тем не менее, мы можем выбрать любой и качестве для всех . Следовательно, .a=16b=4f(n)=n!flogba=2εc>0n!Ω(nk)kTΘ(n!)

дальнейшее чтение

  • Вполне возможно, что ни один из случаев основной теоремы не применим. Например, подзадачи могут не иметь одинаковый размер или иметь более сложную форму. Существуют некоторые расширения теоремы Мастера, например, Akra-Bazzi [1] или Roura [2]. Существует даже версия, которая работает для дискретных повторений (т. Е. Полы и потолки используются для рекурсивных параметров) и обеспечивает более четкие результаты [3].

  • Как правило, прежде чем вы сможете применить теорему Мастера, вы должны втиснуть реальное рекуррентное отношение, которое у вас есть, в форму. Общие преобразования, которые сохраняют асимптотику, включают в себя падение этажей и потолков, а также допущение . Будьте осторожны, чтобы не сломать вещи здесь; обратитесь к [4] раздел 4.6 и этот вопрос для деталей.n=bk


  1. О решении линейных рекуррентных уравнений М. Акра и Л. Бацци (1998)
  2. Улучшенная основная теорема о рекуррентах типа «разделяй и властвуй » С. Руры (1997).
    Относится к другим улучшенным основным теоремам.
  3. Основная теорема о дискретных рекуррентах «разделяй и властвуй » М. Дрмоты и В. Шпанковского (2011)
  4. Введение в алгоритмы по Cormen и др. (2009, 3-е издание)

Это может быть глупый вопрос, но мне часто не удается удержать ментальную модель, когда а не равно b, я не знаю, почему, но интуитивно я всегда чувствую, что оба должны быть одинаковыми всегда, как в случае слияния мы делим проблему на две равные (почти) половины и с n / 2 экземплярами каждый. Кроме того, если мы разделим алгоритм на три равные части, то входные данные также следует разделить на три равные части, что снова делает a и b равными. Как я могу сломать эту неправильную интуицию?
CodeYogi

17

Угадай и докажи

Или, как мне нравится это называть, « техника ». Это может быть применено ко всем видам идентичностей. Идея проста:

Угадай решение и докажи его правильность.

Это популярный метод, возможно, потому что он обычно требует некоторого творчества и / или опыта (хорошо для демонстрации), но немного механики (выглядит элегантно). Искусство здесь состоит в том, чтобы делать хорошие, образованные догадки; доказательство (в нашем случае) обычно более или менее простая индукция.

При применении к рецидивам «угадывание» обычно выполняется

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

Простой пример

s0=s1=s2=1sn=5sn3+6n2

Давайте расширим определение несколько раз:sn

sn=5sn3+6=5(5sn6+6)+6=5(5(5sn9+6)+6)+6 =5(5(5(51n÷3 times+6)+6)+6)+6n÷3 times

Здесь, образец легко обнаружить, и это приводит нас к заявлению:

sn=5n3+6i=0n315i=525n364

Теперь мы докажем тождество по индукции. Для мы можем установить правильность, вставив соответствующее значение. Предполагая, что тождество выполняется для всех для произвольного, но фиксированного , мы вычисляемn{0,1,2}nnn3

sn+3=5sn+6=5(525n364)+6=525n3+164=525n+3364

который доказывает идентичность силой индукции.

Если вы попытаетесь использовать это для более сложных повторений, вы быстро столкнетесь с основным недостатком этого метода: может быть сложно увидеть шаблон или сжать его до красивой замкнутой формы.

асимптотике

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

Рассмотрим, например, повторение во время выполнения Mergesort, упрощенное для случая ¹:n=2k

T(1)=T(0)=0T(n)=2T(n/2)+n1n1

Мы предполагаем, что с константой , то есть . Докажем это индукцией по ; индуктивный шаг выглядит так:T(n)O(nlogn)c=1T(n)nlognk

T(n)=2T(n/2)+n12n2logn2+n1=nlognnlog2+n1<nlogn


  1. Для неубывающих последовательностей натуральных чисел каждая бесконечная подпоследовательность имеет такой же асимптотический рост, что и исходная последовательность.

15

Метод Акра-Бацци

Метод Акра-Бацци дает асимптотику для повторений вида: Это охватывает обычные повторения «разделяй и властвуй», но также и случаи, когда деление неравномерно. «Термины выдумки» могут обслуживать деления, которые не являются точными, например. Условиями применения являются:

T(x)=1ikaiT(bix+hi(x))+g(x)for xx0
hi(x)
  • Есть достаточно базовых случаев, чтобы начать рецидив
  • и все константыaibi
  • Для всех ,iai>0
  • Для всех ,i0<bi<1
  • |g(x)|=O(xc) для некоторой константы видеcx
  • Для всех ,i|hi(x)|=O(x/(logx)2)
  • x0 является константой

Обратите внимание, что и в качестве пилообразной функции всегда между 0 и 1, заменяя (или качестве подходящего) удовлетворяет условиям .bix=bix{bix}{u}=uubixbixhi

Найдите такой, что: Тогда асимптотическое поведение при определяется как: с "достаточно большим", т.е. так что для всех .p

1ikaibip=1
T(x)x
T(x)=Θ(xp(1+x1xg(u)up+1du))
x1k1>0
(2)g(x/2)k1g(x)
x>x1

Пример А

В качестве примера возьмем рекурсию для , где : Условия выполнены, нам нужно : Как повезет, . Таким образом, мы имеем: n5T(0)=T(1)=T(2)=T(3)=T(4)=17

T(n)=9T(n/5)+T(4n/5)+3nlogn
p
9(15)p+(45)p=1
p=2
T(n)=Θ(n2(1+3n3uloguu3du))=Θ(n2)

поскольку с помощью мы выполняем для всех . Обратите внимание, что поскольку интеграл сходится, даже если мы используем другие константы, такие как , в качестве нижней границы, их также допустимо использовать; Разница исчезает в .k112(1log2log3)(2)x31Θ

Пример Б

Другим примером является следующее для : Мы имеем , проверьте. У нас есть, что есть один , , который проверяет. Предполагая, что действительно и / или , подразумеваемое также проверяется. Итак, нам нужно: Таким образом, , и: n2

T(n)=4T(n/2)+n2/lgn
g(n)=n2/lnn=O(n2)a1=4b1=1/2n/2n/2n/2hi(n)
a1b1p=4(1/2)p=1
p=2
T(n)=Θ(n2(1+2nu2duu3lnu))=Θ(n2(1+2nduulnu))=Θ(n2lnlnn)
Применим трюк, описанный выше, к нижняя граница интеграла, только то, что мы используем потому что интеграл не сходится для .21

(Помощь максимумов с алгеброй с благодарностью признана)


1
Я проверил оригинал бумаги. У них есть техническое ограничение на нижнюю границу интеграла; Ваша версия (со ссылкой на опрос Мельхорна?) явно требует, чтобы интеграл сходился. Поскольку я думаю, что исходное условие легче проверить, я изменил утверждение и примеры соответственно, пожалуйста, проверьте.
Рафаэль

1
Кроме того, оригинальная статья не дает версию с ; это взято из рукописи Лейтона? У вас есть рецензируемая ссылка для этого? Должны ли мы перейти к версии, приведенной в документе Akra & Bazzi 1998 года? hi
Рафаэль

1
Я наткнулся на несоответствие в теореме . Может быть, вы знаете ответ?
Рафаэль

11

суммирование

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

T(n)=T(n1)+f(n),
f(n)
T(n)=T(c)+m=c+1nf(m),
T(c)T(n)f(c+1)++f(m)

Неубывающийf(n)

Когда монотонно неубывающая, мы имеем очевидные границы Эти оценки наилучшим образом возможны в том смысле, что они ограничены для некоторых функций: верхняя граница для постоянных функций и нижняя граница для ступенчатых функций ( для и для ). Однако во многих случаях эти оценки не очень полезны. Например, когда , нижняя граница равна а верхняя граница равна , поэтому они довольно далеко друг от друга.f(n)

f(n)m=c+1nf(m)(nc)f(n).
f(m)=1mnf(m)=0m<nf(m)=mn(nc)n

интеграция

оценку дает интеграция: Для это дает правильное значение суммы до членов более низкого порядка: Когда мы можем вычислить сумму явно, но во многих случаях явное вычисление затруднительно. Например, когда антипроизводное равно , и поэтому

cnf(x)dxm=c+1nf(m)c+1n+1f(x)dx.
f(m)=m
12n212c2m=c+1nm12(n+1)212(c+1)2.
f(m)=mf(m)=mlogmf(1/2)x2logx(1/4)x2
m=c+1nmlogm=12n2logn±Θ(n2).

Формула Эйлера – Маклаурина дает лучшие оценки. Эту формулу можно использовать, например, для доказательства сильных форм формулы Стирлинга путем оценки суммы .logn!=m=1nlogm

Не возрастающийf(n)

В некоторых случаях монотонно не возрастает. Тривиальные оценки становятся а интегральные оценки Например, для , используя получаем f(n)

f(1)m=c+1nf(m)(nc)f(1),
c+1n+1f(x)dxm=c+1nf(m)cnf(x)dx.
f(m)=1/mf(m)=logm
m=c+1n1m=logn±Θ(1).

Этот ответ имеет дело не столько с решением повторений, сколько с оценкой сумм (что может быть полезно при решении повторений); техника двойственна римановым суммам . Он также должен работать с другими формами, такими как для константы ? T(nd)d
Рафаэль

Справа, также может быть решена таким образом. T(n)=cT(nd)+f(n)
Юваль Фильмус

9

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

Этот учебник по этому предмету был написан Фладжоле и Седжвиком и является отличным справочным материалом. Несколько более простое изложение, ориентированное на приложения к анализу алгоритмов, - это текст Седжвика и Флайолета.

Надеюсь это поможет!


4
Это хорошая ссылка, но мы хотим собрать методы доступным способом. Можете ли вы представить один конкретный метод в деталях?
Рафаэль

9

Могут быть случаи, когда вы сталкиваетесь с странным повторением, подобным этому: Если вы похожи на меня, вы поймете, что не можете использовать основную теорему, и тогда вы можете подумать: " хммм ... может быть, анализ дерева повторений может сработать ". Тогда вы поймете, что дерево начинает расти очень быстро. После некоторых поисков в интернете вы увидите, что метод Акра-Бацци сработает! Тогда вы на самом деле начинаете изучать это и понимаете, что на самом деле не хотите заниматься всей математикой. Если вы были похожи на меня до этого момента, вы будете рады узнать, что есть более простой способ.

T(n)={cn<72T(n5)+4T(n7)+cnn7


Теорема о неравномерности расщепления, часть 1

Пусть и положительные постоянные.ck

Тогда пусть будут такими положительными постоянными, что .{a1,a2,,ak}1kai<1

У нас также должно быть повторение формы (как наш пример выше):

T(n)c0<n<max{a11,a21,,ak1}T(n)cn+T(a1n)+T(a2n)+T(akn)nmax{a11,a21,,ak1}

Запрос

Тогда я утверждаю где - постоянная (например, асимптотически линейная) и:T(n)bnb

b=c1(1kai)

Доказательство по индукции

Основа :n<max{a11,a21,,ak1}T(n)c<b<bn

Индукция : предположим, что истина для любого , тогда мы имеемn<n

T(n)cn+T(a1n)+T(a2n)++T(akn)cn+ba1n+ba2n++bakncn+ba1n+ba2n++bakn=cn+bn1kai=cncn1kai1(1kai)+cn1kai1(1kai)=cn1(1kai)=bn

Тогда .T(n)bnT(n)=O(n)

пример

T(n)={cn<72T(n5)+4T(n7)+cnn7
Сначала мы проверяем коэффициенты внутри суммы рекурсивных вызовов на единицу:
1>1kai=15+15+17+17+17+17=25+47=3435

Далее мы проверяем, что базовый случай меньше, чем максимум из обратных коэффициентов:

n<max{a11,a21,,ak1}=max{5,5,7,7,7,7}=7

При соблюдении этих условий мы знаем где - постоянная, равная: Поэтому имеем: T(n)bnb

b=c1(1kai)=c13435=35c
T(n)35cnT(n)cnT(n)=Θ(n)


Теорема о неравномерности расщепления, часть 2

Точно так же мы можем доказать оценку, когда . Доказательство будет следовать большей части того же формата:1k=1

Пусть и положительные постоянные такие, что .ckk>1

Тогда пусть будут такими положительными постоянными, что .{a1,a2,,ak}1kai=1

У нас также должно быть повторение формы (как наш пример выше):

T(n)c0<n<max{a11,a21,,ak1}T(n)cn+T(a1n)+T(a2n)+T(akn)nmax{a11,a21,,ak1}

Запрос

Затем я утверждаю, что (мы выбираем base потому что будет фактором ветвления дерева рекурсии), где и - константы (например, асимптотически линейные ) такой что:T(n)αnlogkn+βnlogkkαβ

β=c
и
α=c1kailogkai1

Доказательство по индукции

Основа :n<max{a11,a21,,ak1}T(n)c=β<αnlogkn+βn

Индукция : предположим, что истина для любого , тогда мы имеемn<n

T(n)cn+T(a1n)+T(a2n)++T(akn)cn+1k(αainlogkain+βain)=cn+αn1k(ailogkain)+βn1kai=cn+αn1k(ailogknai1)+βn=cn+αn1k(ai(logknlogkai1))+βn=cn+αn1kailogknαn1kailogkai1+βn=αn1kailogkn+βn=αnlogkn+βn

Тогда .T(n)αnlogkn+βnT(n)=O(nlogn)

пример

Давайте изменим предыдущий пример, который мы использовали чуть-чуть:

T(n)={cn<352T(n5)+4T(n7)+T(n35)+cnn35

Сначала мы проверяем коэффициенты внутри суммы рекурсивных вызовов на единицу:

1=1kai=15+15+17+17+17+17+135=25+47+135=3535

Далее мы проверяем, что базовый случай меньше, чем максимум из обратных коэффициентов:

n<max{a11,a21,,ak1}=max{5,5,7,7,7,7,35}=35

При соблюдении этих условий мы знаем где и - постоянная, равная: Поэтому имеем: T(n)αnlogn+βnβ=cα

b=c1kailogkai1=c2log755+4log777+log735351.048c
T(n)1.048cnlog7n+cnT(n)=O(nlogn)


6

После повторной проверки этого поста, я удивлен, что это еще не здесь.

Преобразование домена / изменение переменных

При работе с рекурсиями иногда полезно иметь возможность сменить домен, если неясно, насколько глубоким будет стек рекурсии.

Например, возьмем следующее повторение:

T(n)=T(22loglogn)+logloglogn

Как мы можем когда-нибудь решить это? Мы могли бы расширить серию, но я обещаю, что это получится очень быстро. Вместо этого давайте рассмотрим, как меняется наш ввод при каждом вызове.

Сначала мы имеем:

  1. n , то
  2. 22loglogn , затем
  3. 22loglog(22loglogn) и т. Д.

Цель преобразования области теперь будет состоять в том, чтобы изменить нашу рекуррентность на эквивалентный , так что вместо вышеупомянутых переходов у нас просто есть .S(k)k,k1,k2,

Например, если мы допустим , то это то, что мы получаем для нашего повторения выше: Тогда мы можем просто переписать его как: Тогда все, что вам нужно сделать, это преобразовать обратно в чтобы получить: n=2222k

T(2222k)=T(22loglog2222k)+logloglog(2222k)=T(2222k1)+2k
T(k)=T(k1)+2k=i=1k2k=2k+11
kn
T(n)=2(loglogloglogn)+11=O(logloglogn)


На этом примере мы можем теперь увидеть нашу цель.

Предположим, что Для некоторой константы и функции и .

T(n)={h(1)n=1aT(f(n))+h(n)otherwise
af(n)h(n)

Сейчас мы пытаемся найти некоторую функцию и такую, что g(k)=nf(g(k))=g(k1)

T(g(k))=aT(f(g(k)))+h(g(k))=aT(g(k1))+h(g(k))

В более общем смысле, мы хотим, чтобы где - повторное применение к , разам. (например, ). Это позволит действовать как «итеративная» функция. Где на глубине рекурсии проделанная работа - это просто .f(i)(n)=g(ki)f(i)(n)fnif(2)(n)=f(f(n))g(k)ih(g(ki))

Тогда мы можем легко преобразовать это в так что Тогда нам остается только беспокоиться о суммируя для всех до заданного базового случая. То есть S(k)=T(g(k))

S(k)=aS(k1)+h(g(k))
h(g(k))k
S(k)=i=g1(1)kakih(g(i))

Если мы можем определить для некоторой замкнутой формы функции, то мы можем определить как S(k)=γ(k)γT(n)

T(n)=γ(g1(n))

Затем мы используем это, чтобы получить оценку помощью одного из других методов выше. Очевидно, вы могли бы немного изменить этот метод в соответствии со своей спецификацией, но в целом вы пытаетесь найти итерационную функцию чтобы превратить в простую рекурсию.T(n)g(k)T(n)

Я не знаю точного способа определения на данный момент, но я буду продолжать думать об этом и буду обновлять, если он станет более понятным (или если у любого комментатора есть некоторые советы!). В прошлом я в основном обнаруживал свои функции методом проб и ошибок (см. Здесь , здесь , здесь и здесь для примеров).g(k)g(k)


1
Есть ли какие-либо ограничения на , и / или ? Я спрашиваю конкретно, потому что подобные трюки с подменой фольклора иногда терпят неудачу, когда речь идет о записи Ландау, что меня беспокоит, если это действительно всегда правильный ответ. fghγg1
Рафаэль

@ Рафаэль, это та часть, в которой я не совсем уверен. Есть несколько вещей, которые я считаю необходимыми для установления эквивалентности. 1) Глубина рекурсии одинакова, это можно обеспечить с помощью и . 2) работа, выполняемая на каждом уровне рекурсии, одинакова, что, как я считаю, обеспечивается а затем . Основная идея этого состоит в том, чтобы просто превратить в сумму, а именно . Преобразование из в я также не уверен на 100% (у меня нет доказательств), но я не могу понять, почему это будет неверен. Мысли? f(g(k))=g(k1)g(k)=ng(k)=nh(g(k))=h(n)T(n)i=ckh(g(i))γ(k)γ(g1(n))
Райан

@ Рафаэль, вы также можете рассмотреть случай, когда вместо , тогда преобразование в должно быть более прямым вперед. Легко доказать, что я думаю, если вы просто показываете эквивалентность в суммировании. Вы, вероятно, столкнетесь с какой-то забавной проблемой с нотацией Ландау, но если вы оставили Ландау вне этого и застряли только с точным равенством, я думаю, это должно быть хорошо. S(k)=γ(k)ΘT(n)=γ(g1(n))
Райан

@ Рафаэль Я отредактировал это, чтобы использовать только равенство, таким образом, примечание Ландау не должно испортить это. Также обобщено немного больше. Что вы могли бы даже обобщить, чтобы использовать функцию вместо константы . Тогда вместо в сумме просто примените . β(n)aakiβ(g(i))
Райан

5

Есть еще один подход, который работает для простых рекуррентных отношений: попросите Wolfram Alpha решить эту рецидив за вас.

Например, попробуйте ввести f(0)=0, f(1)=1, f(n)=f(n-1)+f(n-2)Wolfram Alpha. Вы получите решение со ссылкой на числа Фибоначчи. Или попробуйте f(1)=1, f(n)=f(n-1)+nили f(1)=1, f(n)=2*f(n-1)+3*nили f(n)=f(n-1) + 2 f(n-2), f(1)=1, f(2)=3для других примеров. Тем не менее, будьте осторожны: Wolfram Alpha может решить некоторые очень простые повторения, но она разваливается на более сложные.

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


3
Я действительно думаю , что цель этого сайта была бы объяснить , как компьютерная алгебра делает такие вещи, чтобы не выступать за его слепое использование. Но инструменты являются полезными, так полезны в том , что один , вероятно , следует всегда стараться их , прежде чем «тратить» время (в «практике»).
Рафаэль

Исходя из моего собственного опыта, попытка использовать компьютерную алгебру без какого-либо понимания того, что является «сложным» или «легким», не дает вам очень далеко. Особенно в анализе алгоритма, может потребоваться некоторый массаж. Я не знаю, как ты это делаешь, не зная, как решить рецидивы самостоятельно. (Что касается цели этого сайта, существует несколько точек зрения. Факт: пока что «это кому-то полезно » было недостаточно для обоснования поста.)
Рафаэль

5

Случай 2 основной теоремы, как обычно указывается, обрабатывает только повторения вида в которых для . Следующая теорема, взятая из раздаточного материала Джеффри Леона, дает ответ для отрицательного :T(n)=aT(n/b)+f(n)f(n)=Θ(nlogablogkn)k0k

Рассмотрим рекуррентность с соответствующим базовым случаем.T(n)=aT(n/b)+f(n)

  1. Если для то .f(n)=O(nlogbalogc1n)c<0T(n)=Θ(nlogba)

  2. Если для то .f(n)=Θ(nlogbalogc1n)c=0T(n)=Θ(nlogbaloglogn)

  3. Если для то ).f(n)=Θ(nlogbalogc1n)c>0T(n)=Θ(nlogbalogcn

В доказательстве используется метод многократной подстановки, который мы сейчас набросаем. Предположим, что и . Тогда для степень , Теперь давайте рассмотрим случаи один за другим. Когда , ряд сходится, и поэтому . Когда , сумма представляет собой гармоническую сумму и т. Д.f(n)=nlogbalogbc1nT(1)=0nb

T(n)=i=0logbn1ai(nbi)logbalogbc1(nbi)=i=0logbn1nlogba(logbni)c1=nlogbaj=1logbnjc1.
c<0j=0jc1T(n)=Θ(nlogba)c=0Hlogbn=log(logbn)+O(1)T(n)=Θ(nlogbaloglogn) . Когда , мы можем приблизить сумму с помощью интеграла: и поэтому .c>0
j=1logbn0logbnxc1dx=xcc|0logbn=logbcnc,
T(n)=Θ(nlogbalogcn)
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.