Resolver o aproximar relaciones de recurrencia para secuencias de números


90

En informática, a menudo tenemos que resolver relaciones de recurrencia , es decir, encontrar una forma cerrada para una secuencia de números definida recursivamente. Al considerar los tiempos de ejecución, a menudo nos interesa principalmente el crecimiento asintótico de la secuencia .

Ejemplos son

  1. El tiempo de ejecución de una función recursiva de cola que desciende a desde cuyo cuerpo toma tiempo :0nf(n)

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

  2. La secuencia de Fibonacci :

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

  3. El número de palabras Dyck con pares de paréntesis:n

    C0=1Cn+1=i=0nCiCni

  4. La recurrencia de tiempo de ejecución mergesort en listas de longitud :n

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

¿Cuáles son los métodos para resolver las relaciones de recurrencia? Estamos buscando

  • métodos generales y
  • métodos para una subclase significativa

tanto como

  • métodos que producen soluciones precisas y
  • métodos que proporcionan (limita) el crecimiento asintótico.

Se supone que esto se convertirá en una pregunta de referencia. Publique una respuesta por método y proporcione una descripción general, así como un ejemplo ilustrativo.


99
Estas notas pueden ser útiles. (Pero no, no los transcribiré en respuestas.)
JeffE

Respuestas:


35

Convertir historia completa en historia limitada

Este es un primer paso para resolver las recurrencias donde el valor en cualquier número entero depende de los valores en todos los números enteros más pequeños. Considere, por ejemplo, la recurrencia que surge en el análisis de clasificación rápida aleatoria . (Aquí, es el rango del pivote elegido al azar). Para cualquier número entero , el valor de depende de todos los con . Las recurrencias de esta forma se llaman recurrencias de historia completa .knT(n)T(k)k<n

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

Para resolver esta recurrencia, podemos transformarla en una recurrencia histórica limitada , donde depende solo de un número constante de valores anteriores. Pero primero, ayuda a simplificar un poco la recurrencia, a recopilar términos comunes y eliminar fracciones molestas. Ahora para convertir a una recurrencia de historial limitado , anotamos la recurrencia para , resta y vuelve a reunir los términos: 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

Ahora, si definimos y reemplazamos la fracción con la forma asintótica más simple , obtenemos la recurrencia mucho más simple Expandir esta recurrencia en una suma inmediatamente nos da , donde es el número armónico . Concluimos que .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
Si desea la solución precisa para , eso tampoco es difícil (aquí), si es un poco tedioso; obtenemos . En realidad, me confunde, así que prefiero la variante precisa. Sumas molestas de términos de Landau . T ( n ) = 2 ( n + 1 ) H n + ( T ( 0 ) - 3 ) n + T ( 0 ) n i = 1 Θ ( 1 / i ) = Θ ( H n )TT(n)=2(n+1)Hn+(T(0)3)n+T(0)i=1nΘ(1/i)=Θ(Hn)
Raphael

En realidad, es suficiente observar (inductivamente) que , donde . De hecho, ya usé ese truco al principio, cuando reemplacé el tiempo para particionar una matriz con el más simple . Este es un abuso de notación completamente estándar. t ( n ) = 1 / n + t ( n - 1 ) Θ ( n ) nT(n)/(n+1)=Θ(t(n))t(n)=1/n+t(n1)Θ(n)n
JeffE

28

Funciones de generación

Cada serie de números corresponde a una función generadora . A menudo se puede obtener cómodamente a partir de una recurrencia para obtener sus coeficientes, los elementos de la serie, arrancados.

Esta respuesta incluye el ansatz general con un ejemplo completo, un acceso directo para un caso especial y algunas notas sobre el uso de este método para obtener asintóticos (incluso si no se puede obtener el resultado preciso).

El método

Deje una serie de números. Entonces, la serie de poder formal(an)nN

A(z)=n=0anzn

es la función generadora ordinaria ¹ de . Los coeficientes en la expansión en serie de iguales a la secuencia, es decir, . Por ejemplo, la función generadora ordinaria de los famosos números catalanes es(an)nNA(z)[zn]A(z)=an Cn

C(z)=114z2z .

La definición de también es nuestro ansatz para resolver una recurrencia. Esto funciona mejor para las recurrencias lineales, así que supongamos, por simplicidad, una recurrencia de la formaA

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

para algunos fijo y una función independiente de todos . Ahora simplemente insertamos tanto los anclajes como la parte recursiva en el ansatz, es decirb1,,bkRf(n):NNai

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

Usando la mecánica de la manipulación de la suma, las propiedades de las series de poder formales y las identidades conocidas ², el último lado derecho tiene que ser llevado a formas cerradas, típicamente en términos de . La ecuación resultante puede (a menudo) resolverse para . La expansión en serie del resultado (que puede obtenerse fácilmente, ser conocida o de otra manera accesible) es esencialmente la solución.A(z)A(z)

Se pueden encontrar buenas presentaciones en el libro de Wilf [3] y en GKP [4]. Flajolet y Sedgewick han recogido material avanzado [5].

Ejemplo

Considerar

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

Calculamos:

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

Esto resuelve a

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

Ahora finalmente podemos leer

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

Una vez que te acostumbras , notas que todo esto es bastante mecánico. De hecho, el álgebra computacional puede hacer todo esto por usted en muchos casos. Lo bueno es que sigue siendo (más o menos) esa mecánica incluso si la recurrencia es más compleja. Vea aquí un ejemplo más complicado y menos mecánico.

También tenga en cuenta que las técnicas generales también funcionan si los objetos buscados son números complejos, o incluso polinomios.

Un atajo

Para recurrencias lineales y homogéneas, es decir, de la forma

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

Lo anterior pasa exactamente de la misma manera, siempre. Al realizar el cálculo anterior simbólicamente, encontramos el siguiente lema . Dejar

zkb1zk1b2zk2bk

ser el polinomal característico (de la recurrencia). Supongamos además los (por pares distintos) de dicho polinomio con multiplicidad , respectivamente. Entonces, el coeficiente deseado viene dado porλ1,,λlri

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

con desconocido . Como el polinomio característico tiene un grado , existen exactamente (complejos) ceros, es decir, la suma a . Por lo tanto, los coeficientes faltantes se pueden determinar resolviendo el sistema de ecuaciones lineales con ecuaciones obtenidas al igualar la fórmula anterior con cualquier de (por ejemplo, los anclajes).bi,jkkrikkkan

Asintóticas

Llegar a un formulario cerrado para suele ser la parte fácil. Sin embargo, expresarlo en funciones generadoras que conocemos los coeficientes de (como lo hicimos en el ejemplo) se vuelve rápidamente difícil. Los ejemplos son de arriba y el del número de palabras Dyck mencionadas en la pregunta.A(z)C(z)

Se puede emplear maquinaria de análisis compleja, específicamente análisis de singularidad, para obtener asintóticos para los coeficientes; Las palabras de moda incluyen el método de Darboux y el método de punto de silla. Estos se basan en el teorema de residuos y la fórmula integral de Cauchy . Ver [6] para más detalles.


  1. Puede hacer cosas similares con exponencial , Dirichlet y algunas otras funciones generadoras. Lo que funciona mejor depende de la secuencia en cuestión y, en particular, si encuentra las formas cerradas necesarias.
  2. Por ejemplo, de la TCS Cheat Sheet o [3].
  3. Generationfunctionology por H. Wilf (1994, 2ª ed.) - disponible para descarga gratuita
  4. Matemáticas concretas por RL Graham, DE Knuth y O. Patashnik (1994, 2ª ed.)
  5. Introducción al análisis de algoritmos por R. Sedgewick y P. Flajolet (2a edición, 2013) - disponible para descarga gratuita
  6. Analytic Combinatorics por P. Flajolet y R. Sedgewick (2009) - disponible para descarga gratuita

21

Teorema maestro

El teorema maestro proporciona asintóticos para las soluciones de las recurrencias denominadas divide y vencerás , es decir, dividir sus parámetros en fragmentos proporcionales (en lugar de cortar constantes). Por lo general, se producen al analizar algoritmos de división y conquista (recursivos), de ahí el nombre. El teorema es popular porque a menudo es increíblemente fácil de aplicar. Por otro lado, solo se puede aplicar a las recurrencias de la siguiente forma:

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

con . Hay tres casosa1,b>1

  1. fO(nlogb(a)ε)

    para algunos ;ε>0

  2. fΘ(nlogbalogkn) ,

    para algunos ;k0

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

    para algunos yε>0

    af(nb)cf(n)

    para algunos y .c<1n

que implican los asintóticos

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

respectivamente. Tenga en cuenta que los casos base no se indican ni se usan aquí; eso tiene sentido, considerando que solo estamos investigando el comportamiento asintótico . Nos silencio suponer que son algunas constantes (¿qué más pueden ser. ¿Qué constantes que no vemos es irrelevante, todos ellos se desvanecen en el .Θ

Ejemplos

  1. Considera la recurrencia

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

    Con y - tenga en cuenta que vemos que el caso uno se aplica con . Por lo tanto, .f(n)=n,a=4b=3logba1.26ε=0.25TΘ(nlog34)=Θ(n1.261)

  2. Considera la recurrencia

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

    Con y - tenga en cuenta que vemos que el caso dos se aplica con . Por lo tanto, .f(n)=n,a=2b=2logba=1k=0TΘ(nlogn)

  3. Considera la recurrencia

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

    Con y - tenga en cuenta que vemos que el caso tres se aplica con y . Por lo tanto, .f(n)=n,a=3b=4logba0.79ε=0.2c=1TΘ(n)

  4. Considera la recurrencia

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

    Aquí tenemos , y- muchos ejemplos estándar tendrán el polinomio , pero esto no es una regla. Tenemos , y el caso tres se aplica nuevamente. Sin embargo, en este caso, podemos elegir cualquier y como para todos los . De ahí .a=16b=4f(n)=n!flogba=2εc>0n!Ω(nk)kTΘ(n!)

Otras lecturas

  • Es muy posible que no se aplique ninguno de los casos del teorema maestro. Por ejemplo, los subproblemas pueden no tener el mismo tamaño o tener una forma más compleja. Hay algunas extensiones del teorema del Maestro, por ejemplo Akra-Bazzi [1] o Roura [2]. Incluso hay una versión que funciona para recurrencias discretas (es decir, se usan pisos y techos en los parámetros recursivos) y proporciona resultados más nítidos [3].

  • Por lo general, debe dar masajes a la relación de recurrencia real que tiene en forma antes de poder aplicar el teorema maestro. Las transformaciones comunes que preservan los asintóticos incluyen la caída de pisos y techos, así como la suposición de . Tenga cuidado de no romper cosas aquí; consulte [4] la sección 4.6 y esta pregunta para más detalles.n=bk


  1. Sobre la solución de ecuaciones de recurrencia lineal por M. Akra y L. Bazzi (1998)
  2. Un teorema maestro mejorado para las recurrencias de divide y vencerás por S. Roura (1997)
    Se refiere a otros teoremas maestros mejorados.
  3. Un teorema maestro para las repeticiones discretas de dividir y conquistar por M. Drmota y W. Szpankowski (2011)
  4. Introducción a los algoritmos por Cormen et al. (2009, 3a edición)

Esta podría ser la pregunta estúpida, pero a menudo no puedo mantener el modelo mental cuando a no es igual a b, no sé por qué, pero por intuición siempre siento que ambos deben ser siempre iguales, como en la combinación dividimos el problema en dos mitades iguales (casi) y con n / 2 instancias cada una. Además, si dividimos el algoritmo en tres partes iguales, las entradas también deberían dividirse en tres partes iguales, lo que nuevamente hace que ayb sean iguales. ¿Cómo puedo romper esta intuición equivocada?
CodeYogi

17

Adivina y prueba

O cómo me gusta llamarlo, la " técnica de ". Se puede aplicar a todo tipo de identidades. La idea es simple:

Adivina la solución y prueba su corrección.

Este es un método popular, posiblemente porque generalmente requiere algo de creatividad y / o experiencia (bueno para presumir) pero poca mecánica (se ve elegante). El arte aquí es hacer conjeturas bien educadas; la prueba es (en nuestro caso) generalmente una inducción más o menos simple.

Cuando se aplica a las recurrencias, la "suposición" generalmente se realiza

  • expandiendo la recurrencia un par de veces,
  • descifrar el ancla y
  • adivinando el patrón para el intermedio (los ).

Ejemplo simple

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

algunas veces la definición de :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

Aquí, el patrón es fácil de detectar y nos lleva a la afirmación:

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

Ahora probamos la identidad por inducción. Para , podemos establecer la corrección al insertar el valor respectivo. Suponiendo que la identidad se cumple para todos para un arbitrario pero fijo , calculamosn{0,1,2}nnn3

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

que prueba la identidad por el poder de la inducción.

Si intenta usar esto en las recurrencias más complicadas, rápidamente se encuentra con la desventaja principal de este método: puede ser difícil ver el patrón o condensarlo en una forma cerrada agradable.

Asintóticas

También es posible utilizar este método para las asíntotas. Sin embargo, tenga en cuenta que debe adivinar las constantes para los símbolos de Landau, ya que debe haber una constante que establezca el límite para todo , es decir, el factor constante no puede cambiar durante la inducción.n

Considere, por ejemplo, la recurrencia de tiempo de ejecución Mergesort, simplificada para el caso de ¹:n=2k

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

Nosotros suponemos que con constante , que es . Probamos esto por inducción sobre ; el paso inductivo se ve así:T(n)O(nlogn)c=1T(n)nlognk

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


  1. Para secuencias de naturales no decrecientes, cada subsecuencia infinita tiene el mismo crecimiento asintótico que la secuencia original.

15

El método Akra-Bazzi

El método Akra-Bazzi proporciona asintóticos para las recurrencias de la forma: Esto cubre las recurrencias habituales de divide y vencerás, pero también casos en los que la división es desigual. Los "términos " pueden atender divisiones que no resultan exactas, por ejemplo. Las condiciones de aplicabilidad son:

T(x)=1ikaiT(bix+hi(x))+g(x)for xx0
hi(x)
  • Hay suficientes casos básicos para que la recurrencia continúe
  • El y son todos constantesaibi
  • Para todo ,iai>0
  • Para todo ,i0<bi<1
  • |g(x)|=O(xc) para alguna constante comocx
  • Para todo ,i|hi(x)|=O(x/(logx)2)
  • x0 es una constante

Tenga en cuenta que , y como la función diente de sierra siempre está entre 0 y 1, reemplazando (o según corresponda) cumple las condiciones en .bix=bix{bix}{u}=uubixbixhi

Encuentre tal que: Entonces el comportamiento asintótico de como viene dado por: con "suficientemente grande", es decir, hay para que para todos .p

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

Ejemplo A

Como ejemplo, tome la recursividad para , donde : Se cumplen las condiciones, necesitamos : Por suerte, . Así tenemos: 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)

ya que con cumplimos para todos . Tenga en cuenta que debido a que la integral converge incluso si usamos otras constantes, como , como límite inferior, es legal usarlas también; la diferencia se desvanece en .k112(1log2log3)(2)x31Θ

Ejemplo B

Otro ejemplo es el siguiente para : Tenemos , verificar. Tenemos que hay un solo , , que se . Suponiendo que es realmente y / o , el implícito también se revisa. Entonces necesitamos: Por lo tanto, , y: 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)
Aplicamos un truco similar al anterior para el límite inferior de la integral, solo que usamos porque la integral no converge para .21

(Se agradece la ayuda de maxima con el álgebra)


1
Revisé el papel original. Tienen una restricción técnica en el límite inferior de la integral; su versión (¿citando la encuesta de Mehlhorn?) requiere explícitamente que la integral converja. Como creo que la condición original es más fácil de verificar, cambié la declaración y los ejemplos en consecuencia, verifique.
Raphael

1
Además, el documento original no da la versión con ; ¿Está tomado del manuscrito de Leighton? ¿Tiene una referencia revisada por pares para eso? ¿Deberíamos pasar a la versión dada en el artículo de 1998 por Akra & Bazzi? hi
Raphael

1
Me topé con lo que parece ser una inconsistencia en el teorema . Tal vez sabes la respuesta?
Raphael

11

Sumas

A menudo uno encuentra una recurrencia de la forma donde es monótono. En este caso, podemos expandir y así se le da un valor inicial , para estimar necesitamos estimar la suma .

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)

No decrecientef(n)

Cuando es monótono no decreciente, tenemos los límites obvios Estos límites son los mejores posibles en el sentido de que son ajustados para algunas funciones: el límite superior para funciones constantes y el límite inferior para funciones escalonadas ( para y para ). Sin embargo, en muchos casos estas estimaciones no son muy útiles. Por ejemplo, cuando , el límite inferior es y el límite superior es , por lo que están bastante separados.f(n)

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

Integración

La integración proporciona una mejor estimación: Para , esto da el valor correcto de la suma en términos de orden inferior: Cuando podemos calcular la suma explícitamente, pero en muchos casos el cálculo explícito es difícil. Por ejemplo, cuando la antiderivada de es , y entonces

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).

La fórmula de Euler-Maclaurin ofrece mejores estimaciones. Esta fórmula se puede usar, por ejemplo, para probar formas fuertes de la fórmula de Stirling, estimando la suma .logn!=m=1nlogm

No aumentaf(n)

En algunos casos, es monótono y no aumenta. Las estimaciones triviales se convierten en y las estimaciones integrales Como ejemplo, para , usando obtenemos 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).

Esta respuesta se ocupa menos de resolver las recurrencias, sino más bien de estimar sumas (que pueden ser útiles para resolver las recurrencias); La técnica es el doble de las sumas de Riemann . También debería funcionar con otras formas como para constante ? T(nd)d
Raphael

Derecha, también se puede resolver de esta manera. T(n)=cT(nd)+f(n)
Yuval Filmus

9

Sedgewick y Flajolet han realizado un extenso trabajo en combinatoria analítica , lo que permite que las recurrencias se resuelvan asintóticamente utilizando una combinación de funciones generadoras y análisis complejos. Su trabajo permite que muchas recurrencias se resuelvan automáticamente, y se ha implementado en algunos sistemas de álgebra computacional.

Este libro de texto sobre el tema fue escrito por Flajolet y Sedgewick y es una excelente referencia. Una exposición algo más simple, orientada a aplicaciones para el análisis de algoritmos, es este texto de Sedgewick y Flajolet.

¡Espero que esto ayude!


44
Esta es una buena referencia, pero queremos recopilar métodos de manera accesible. ¿Puedes presentar un método en particular en detalle?
Raphael

9

Puede haber ocasiones en las que encuentre una recurrencia extraña como esta: Si eres como yo, te darás cuenta de que no puedes usar el Master Theorem y luego puedes pensar: " hmmm ... tal vez un análisis de árbol de recurrencia podría funcionar ". Entonces te darás cuenta de que el árbol comienza a volverse asqueroso muy rápido. ¡Después de buscar en Internet, verá que el método Akra-Bazzi funcionará! Entonces, realmente comienzas a investigarlo y te das cuenta de que realmente no quieres hacer todos los cálculos. Si has sido como yo hasta este momento, te emocionará saber que hay una manera más fácil.

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


El teorema de división desigual Parte 1

Deje y sean constantes positivas.ck

Luego, deje que sean constantes positivas tales que .{a1,a2,,ak}1kai<1

También debemos tener una recurrencia del formulario (como nuestro ejemplo anterior):

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

Reclamación

Luego reclamo donde es una constante (por ejemplo, asintóticamente lineal) y:T(n)bnb

b=c1(1kai)

Prueba por inducción

Base :n<max{a11,a21,,ak1}T(n)c<b<bn

Inducción : Supongamos que es verdadero para cualquier , entonces tenemosn<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

Entonces tenemos .T(n)bnT(n)=O(n)

Ejemplo

T(n)={cn<72T(n5)+4T(n7)+cnn7
Primero verificamos los coeficientes dentro de la suma de llamadas recursivas a menos de uno:
1>1kai=15+15+17+17+17+17=25+47=3435

Luego verificamos que el caso base es menor que el máximo de las inversas de los coeficientes:

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

Con estas condiciones cumplidas, sabemos donde es una constante igual a: Por lo tanto, tenemos: T(n)bnb

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


El teorema de división desigual Parte 2

Del mismo modo, podemos probar un límite para cuando . La prueba seguirá mucho del mismo formato:1k=1

Sean y constantes positivas de modo que .ckk>1

Luego, deje que sean constantes positivas tales que .{a1,a2,,ak}1kai=1

También debemos tener una recurrencia del formulario (como nuestro ejemplo anterior):

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

Reclamación

Luego reclamo (elegimos base porque será el factor de ramificación del árbol de recursión) donde y son constantes (p. Ej., Lineal y asintóticamente lineal) ) tal que:T(n)αnlogkn+βnlogkkαβ

β=c
y
α=c1kailogkai1

Prueba por inducción

Base :n<max{a11,a21,,ak1}T(n)c=β<αnlogkn+βn

Inducción : Supongamos que es verdadero para cualquier , entonces tenemosn<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

Entonces tenemos .T(n)αnlogkn+βnT(n)=O(nlogn)

Ejemplo

Modifiquemos el ejemplo anterior que usamos solo un poco:

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

Primero verificamos que los coeficientes dentro de las llamadas recursivas sumen uno:

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

Luego verificamos que el caso base es menor que el máximo de las inversas de los coeficientes:

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

Con estas condiciones cumplidas, sabemos que donde y es una constante igual a: Por lo tanto, tenemos: T(n)αnlogn+βnβ=cα

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


6

Después de revisar esta publicación nuevamente, me sorprende que todavía no esté aquí.

Transformación de dominio / Cambio de variables

Cuando se trata de recurrencias, a veces es útil poder cambiar su dominio si no está claro qué tan profundo irá la pila de recurrencia.

Por ejemplo, tome la siguiente recurrencia:

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

¿Cómo podríamos resolver esto? Podríamos ampliar la serie, pero prometo que esto se volverá asqueroso muy rápido. En cambio, consideremos cómo cambia nuestra entrada con cada llamada.

Primero tenemos:

  1. n , entonces
  2. 22loglogn , luego
  3. 22loglog(22loglogn) , y así sucesivamente.

El objetivo de una transformación de dominio ahora será cambiar nuestra recurrencia en una equivalente, de modo que en lugar de las transiciones anteriores, simplemente tengamos .S(k)k,k1,k2,

Por ejemplo, si dejamos , esto es lo que obtenemos para nuestra recurrencia anterior: Entonces podemos simplemente reescribirlo como: Entonces todo lo que tienes que hacer es convertir nuevo a para obtener: 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)


Con este ejemplo, ahora podemos ver nuestro objetivo.

Suponga que Para alguna constante y las funciones y .

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

Ahora estamos tratando de encontrar alguna función y tal que g(k)=nf(g(k))=g(k1)

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

En términos más generales, queremos donde es la aplicación repetida de en , veces. (por ejemplo, ). Esto permitirá que actúe como la función "iterativa". Donde, a profundidad de recursión, el trabajo realizado es simplemente .f(i)(n)=g(ki)f(i)(n)fnif(2)(n)=f(f(n))g(k)ih(g(ki))

Entonces podemos convertir esto fácilmente a para que Entonces solo tenemos que preocuparnos por resumiendo para todos los hasta un caso base dado. Es decir, S(k)=T(g(k))

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

Si podemos determinar para alguna forma cerrada función , entonces podemos determinar como S(k)=γ(k)γT(n)

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

Luego usamos esto para obtener un límite en través de uno de los otros métodos anteriores. Obviamente, podría modificar este método un poco para su especificación, pero en general está tratando de encontrar una función iterativa para convertir en una simple recursión.T(n)g(k)T(n)

No sé una forma exacta de determinar en este punto, pero seguiré pensando en ello y actualizaré si se vuelve más claro (¡o si algún comentarista tiene algunos consejos!). La mayoría de las veces he encontrado mis funciones través de prueba y error (ver aquí , aquí , aquí y aquí para ver ejemplos).g(k)g(k)


1
¿Hay alguna restricción en , y / o ? Estoy preguntando específicamente porque los trucos similares de sustitución del folclore a veces fallan cuando la notación de Landau está involucrada, lo que me preocupa si realmente siempre es la respuesta correcta. fghγg1
Raphael

@Raphael, esta es la parte de la que no estoy completamente seguro. Creo que hay algunas cosas que debemos asegurar para establecer la equivalencia. 1) La profundidad de recursión es el mismo, esto se puede asegurar mediante y . 2) el trabajo realizado en cada nivel de recursión es el mismo, que creo que se aplica mediante luego . La idea básica de esto es simplemente convertir en una suma, a saber, . La conversión de a tampoco estoy 100% seguro (no tengo una prueba), pero no puedo ver por qué sería incorrecto. Pensamientos? f(g(k))=g(k1)g(k)=ng(k)=nh(g(k))=h(n)T(n)i=ckh(g(i))γ(k)γ(g1(n))
Ryan

@Raphael también podría considerar el caso, donde lugar de , luego convertir a debería ser más directo adelante. Fácil de probar, creo que si solo muestra equivalencia en el resumen. Probablemente te encuentres con problemas graciosos con la notación de Landau aquí, pero si dejas a Landau fuera de ella y solo te quedas con una igualdad precisa, creo que debería estar bien. S(k)=γ(k)ΘT(n)=γ(g1(n))
Ryan

@Raphael Lo edité para usar solo la igualdad, por lo que la notación landau no debería estropear esto. También generalizó un poco más. Que incluso podría generalizar un poco más para usar una función lugar de la constante . Luego, en lugar de en la suma, solo tiene una aplicación de . β(n)aakiβ(g(i))
Ryan

5

Hay un enfoque más que funciona para las relaciones de recurrencia simples: pídale a Wolfram Alpha que resuelva la recurrencia por usted.

Por ejemplo, intente escribir f(0)=0, f(1)=1, f(n)=f(n-1)+f(n-2)en Wolfram Alpha. Obtendrá una solución, con un enlace a los números de Fibonacci. O intente f(1)=1, f(n)=f(n-1)+no f(1)=1, f(n)=2*f(n-1)+3*no f(n)=f(n-1) + 2 f(n-2), f(1)=1, f(2)=3para otros ejemplos. Sin embargo, tenga cuidado: Wolfram Alpha puede resolver algunas recurrencias muy simples, pero se desmorona para las más complejas.

Este enfoque evita la necesidad de pensar, lo que puede verse como un error o una característica.


3
Yo no creo que el propósito de este sitio sería explicar cómo álgebra computacional hace cosas como esta, no para defender su uso ciego. Pero las herramientas son útiles, tan útiles de hecho que probablemente uno debería probarlas siempre antes de "perder" el tiempo (en "práctica").
Raphael

Desde mi propia experiencia, tratar de usar el álgebra computacional sin ningún sentido de lo que es "difícil" o "fácil" no te lleva muy lejos. Especialmente en el análisis de algoritmos, puede ser necesario un poco de masaje. No sé cómo lo haces sin saber cómo resolver las recurrencias tú mismo. (En cuanto al propósito de este sitio, existen múltiples puntos de vista. Hecho: hasta ahora, "esto es útil para alguien " no fue suficiente para justificar una publicación).
Rafael

5

El caso 2 del teorema maestro, como se suele decir, maneja solo las recurrencias de la forma en la que para . El siguiente teorema, tomado de un folleto de Jeffrey Leon, da la respuesta para negativa :T(n)=aT(n/b)+f(n)f(n)=Θ(nlogablogkn)k0k

Considere la recurrencia con un caso base apropiado.T(n)=aT(n/b)+f(n)

  1. Si para entonces .f(n)=O(nlogbalogc1n)c<0T(n)=Θ(nlogba)

  2. Si para entonces .f(n)=Θ(nlogbalogc1n)c=0T(n)=Θ(nlogbaloglogn)

  3. Si para entonces )f(n)=Θ(nlogbalogc1n)c>0T(n)=Θ(nlogbalogcn

La prueba usa el método de sustitución repetida, como ahora bosquejamos. Supongamos que y . Entonces, para una potencia de , Ahora consideremos los casos uno por uno. Cuando , la serie converge, y entonces . Cuando , la suma es la suma armónica , y así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) . Cuando , podemos aproximar la suma usando una integral: y entonces .c>0
j=1logbn0logbnxc1dx=xcc|0logbn=logbcnc,
T(n)=Θ(nlogbalogcn)
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.