2012-06-11 14 views
13

Al programar en Java (o en cualquier otro lenguaje de procedimiento para el caso), a menudo elijo entre resolviendo algo recursivamente frente a resolviéndolo iterativamente. La opción recursiva es a menudo más elegante que una solución iterativa, por lo que generalmente utilizo la solución recursiva. Con una excepción:¿Está bien que la profundidad de la pila sea proporcional a algún tamaño de entrada?

Preocupación por los desbordamientos de la pila Tiendo a evitar soluciones recursivas si la profundidad máxima de la pila es linealmente proporcional al tamaño de la entrada (o algo peor). Sin embargo, me doy cuenta de que en muchos otros lenguajes (incluso los que apuntan a la JVM como Scala y Clojure) muchos algoritmos, como los algoritmos de lista básica, por ejemplo, se expresan recursivamente cuando la profundidad máxima de la pila es proporcional a la longitud de la lista. (1) Entonces, ¿están justificadas mis preocupaciones sobre los desbordamientos de pila en linear-stack-depth-algorithms?

TL; DR: ¿Qué "complejidad de profundidad de pila" se considera razonable? complejidad logarítmica, recursiva de búsqueda binaria, por ejemplo, O (log N) es sin duda bien, pero ¿qué hay de O (N), O (N log N), O (N 2 )? ¿Dónde dibujarías normalmente la línea? (2)

(1) Soy consciente de que estas lenguas a veces apoya cosas como @tailrec, pero esta pregunta se refiere a Java, C#, etc.
(2) Tenga en cuenta que no estoy preocupado por sobrecarga de la CPU etc. Solo la profundidad de la pila.

+0

La complejidad de la profundidad de la pila es una cosa a considerar, pero otra cosa es el tamaño de la entrada en sí. Si el problema excluye la entrada grande de su dominio (para el período de tiempo extendido en el desarrollo), entonces podemos optar por una solución recursiva (suponiendo que la complejidad no excede la capacidad de la pila). Si el tamaño de entrada no está definido, O (1) profundidad de la pila o O (log N) profundidad de la pila es aceptable IMO (O (log N) puede no ser aceptable si el límite superior ** práctico ** en el tamaño de entrada incluso se rompe el tamaño de la pila, pero creo que este caso sería bastante raro). – nhahtdh

+1

"La opción recursiva suele ser más elegante que una solución iterativa" En el 90% de los casos, encuentro lo contrario. Podría depender del tipo de problema que intente resolver y con qué estilo se sienta más cómodo. ;) Normalmente me siento cómodo con o (log N) profundidad recursiva. –

+0

Esto es [tag: language-agnostic] –

Respuesta

1

No puede responder a esto sin preguntarse qué tamaño de entrada desea admitir.

La complejidad del espacio lineal en la pila es absolutamente buena si está procesando un mazo de naipes, y probablemente sea completamente imposible si está utilizando grandes archivos de texto. Necesitas calcular cuál será el tamaño máximo de entrada para tu aplicación, o mejor dicho, la entrada más grande para la que no te importa que falle.

Hacemos esto todo el tiempo. Por ejemplo, cada vez que declaras una matriz en Java, sabes que la matriz no puede contener más de 2 elementos . ¿Eso importa? ¿Significa que el programa está roto? Probablemente no; pero a veces lo hace, si la enorme contribución es algo que desea ser capaz de manejar.

Así que no creo que pueda ser demasiado prescriptivo sobre esto.¿Qué dirías si alguien preguntara (en términos generales) a qué hora la complejidad estaba bien? Podría decir algunos principios generales: por lo general, lo lineal está bien, generalmente lo exponencial es malo ... pero la respuesta real es que depende de lo que esté haciendo.

2

La complejidad de la profundidad de la pila es una cosa a considerar, pero otra cosa es el tamaño de la entrada en sí.

Si el problema excluye entrada grande de su dominio (por extendida período de tiempo en el proceso de desarrollo), entonces podemos ir a dar solución recursiva (por supuesto, la solución recursiva no debe exceder la capacidad de la pila con el la mayor entrada posible).

Si el tamaño de entrada no está definido, la profundidad de la pila O (1) o la profundidad de la pila O (log N) es aceptable, en mi humilde opinión. Es posible que O (log N) no sea aceptable si el límite superior práctico del tamaño de entrada es astronómicamente grande y excede la capacidad de la pila. Sin embargo, creo que ese caso sería bastante raro.

Cuestiones relacionadas