2010-02-27 5 views
7

¿Qué operaciones en los programas Common Lisp se deben considerar suficientemente primitivas como para contar para un único "paso" en el análisis algorítmico? ¿Cuán ampliamente varían los ceceos modernos en su implementación?Sugerencias para el análisis algorítmico de programas Lisp?

Ciertamente, la aritmética con enteros pequeños contaría como un solo paso, pero ¿qué pasa con los números más grandes? ¿Y si consideramos la diferencia entre reverse y nreverse? Específicamente, ¿es nreverse theta de reverse? ¿Qué pasa con todas las operaciones de matriz y secuencia? Además, ¿cómo figuran las macros? ¿Cómo debo pensar en las macros cuando analizo la complejidad?

+1

Eso suena más como un pánico que como una pregunta :-) –

+0

Haha - si es así, no fue intencionado, empecé a pensarlo esta mañana y me di cuenta de que solo podía adivinar sobre tales cosas. – Aoriste

Respuesta

9
  • No intente encontrar una capa inferior de "pasos únicos" uniformes, solo sepa lo que es O (1) y lo que no.
  • La adición de "números más grandes" (bignum s) debe ser O (log n) donde n es el mayor de los enteros. Hay muchos algoritmos diferentes para la multiplicación; No soy un experto en el campo, y es probable que sea específico de la implementación.
  • reverse y nreverse pueden ambos implementarse O (n) (reverse por una estrategia de CDR-input-y-contra-salida; nreverse mediante el intercambio de punteros mientras cdring). Si entiendo el término desconocido "theta of" correctamente, entonces sí. Tenga en cuenta, sin embargo, que el estándar CL no ofrece ninguna garantía sobre la complejidad del tiempo.
  • Las operaciones de secuencia incorporadas generalmente se implementan eligiendo una implementación de matriz o de lista específica según el tipo de argumento, por lo que se espera que sea el algoritmo eficiente ordinario para ese tipo de datos.
  • Las macros simplemente se expanden a otro código. Puedes ver su expansión, o ver lo que están documentados para hacer, o hacer una conjetura sobre el algoritmo que usa su expansión. La complejidad del macroexpandidor es completamente irrelevante (a menos que esté usando eval/compile, en cuyo caso también debe pensar en la complejidad del compilador de la implementación) ya que se ejecuta en tiempo de compilación, una vez; solo el código expandido importa.
+1

+1 para la 1ra bala. –

+0

Muy completo, lo aprecio. – Aoriste

+0

La notación Theta es similar a la notación de O grande, excepto que implica que el costo de la operación está limitado tanto por encima * como por debajo de * por la expresión dada. Mientras que big-O dice "el costo de esta operación no aumenta de manera asintótica más rápidamente que la función dada", big-theta dice "el costo de esta operación no aumenta de manera asintótica más rápidamente que la función dada, y la función dada tampoco crece. asintóticamente más rápido que la función dada ". En otras palabras, big-theta describe un límite inferior en el rendimiento, así como un límite superior. –

Cuestiones relacionadas