Estaba explicando el famoso algoritmo determinista de selección de tiempo lineal ( algoritmo de mediana de medianas) a un amigo.
La recurrencia en este algoritmo (aunque es muy simple) es bastante sofisticada. Hay dos llamadas recursivas, cada una con diferentes parámetros.
Estaba tratando de encontrar otros ejemplos de algoritmos recursivos tan interesantes, pero no pude encontrar ninguno. Todos los algoritmos recursivos que se me ocurren son simples recursiones de cola o simples divide y vencerás (donde las dos llamadas son "iguales").
¿Puedes dar algunos ejemplos de recurrencia sofisticada?
algorithms
recursion
elektronaj
fuente
fuente
Respuestas:
Mi recurrencia favorita aparece en algoritmos sensibles a la salida para calcular cascos convexos, primero por Kirkpatrick y Seidel , pero luego por otros. Deje denotar el tiempo para calcular el casco convexo de n puntos en el plano, cuando el casco convexo tiene h vértices. (El valor de h no se conoce de antemano, aparte del límite trivial h ≤ n .) El algoritmo de Kirkpatrick y Seidel produce la recurrencia T ( n , h ) = n ≤ 3 o h ≤T(n,h) n h h h ≤ n
donden1,n2≤3n/4yn1+n2=nyh1
La solución es . Esto es un poco sorprendente, ya que h no es el parámetro que se divide de manera uniforme. Pero, de hecho, el peor caso de la recurrencia ocurre cuando h 1 y h 2 son ambos acerca de h / 2 ; si de alguna manera mágicamente h 1 es siempre constante, la solución sería T ( n , h ) = O ( n ) .T( n , h ) = O ( n logh ) h h1 h2 h / 2 h1 T( n , h ) = O ( n )
Utilicé una variante de esta recurrencia en uno de mis primeros trabajos de topología computacional : donde n 1 + n
fuente
La recursión que usé en mi artículo "Un algoritmo de tiempo lineal para calcular el diagrama de Voronoi de un polígono convexo" de Aggarwal et al también es bastante complicada.
Aquí hay una descripción del algoritmo de nuestro artículo. En caso de que no esté claro en la descripción, en el paso 3 los puntos rojos se dividen en puntos carmesí y granate. Los pasos 1, 3 y 6 son todos de tiempo lineal. También sabemos que si es el número total de puntos, | B | ≥ α n , | R | ≥ β n , y | C | ≥ γ n para algunos α , β , γ > 0 .norte El | B | ≥αn El | R | ≥βnorte El | C | ≥γnorte α , β, γ> 0
Te dejaré descubrir por qué todo el algoritmo toma tiempo lineal.
fuente
Existe una variación en la mediana de recurrencia de hallazgos que proviene de la búsqueda de rango con medios planos. La recurrencia misma es de la forma
fuente
Hay un montón de algoritmos recursivos geniales [1], [2] utilizados en la predicción de la estructura secundaria de ARN. Dejado a sus propios dispositivos, una cadena de ARN formará pares de bases consigo mismo; un ejemplo relativamente simple de [3] calcula el número máximo de bases anidadas y emparejadas que se formará una cadena de ARN consigo misma:
Plegado óptimo por computadora de grandes secuencias de ARN utilizando termodinámica e información auxiliar por M. Zuker, P. Stiegler (1981)
Algoritmo de programación dinámica para la predicción de la estructura de ARN que incluye pseudonudos por E. Rivas, SR Eddy (1999)
Algoritmo rápido para predecir la estructura secundaria del ARN monocatenario por R. Nussinov, AB Jacobson (1980)
fuente
Todavía no entiendo lo que quieres decir con "recursión sofisticada". Por ejemplo, el paso de recursión en el algoritmo FFT es sofisticado.
Pero si desea buscar una recursión más complicada , entonces la recursividad mutua podría ser una posible respuesta. La recursividad mutua es útil cuando se trabaja con lenguajes de programación funcionales . La recursividad mutua es la característica clave de los analizadores de descenso recursivo .
fuente
Fuera de mi cabeza, la función McCarthy 91
y la función de Ackermann
podría contar como funciones recursivas poco convencionales, aunque juguetonas.
fuente