¿En qué medida puede un algoritmo predecir la complejidad temporal de un programa de entrada arbitrario?

23

El problema de detención indica que es imposible escribir un programa que pueda determinar si otro programa se detiene, para todos los programas de entrada posibles .

Sin embargo, ciertamente puedo escribir un programa que pueda calcular el tiempo de ejecución de un programa como:

for(i=0; i<N; i++)
    { x = 1; }

y devuelve una complejidad de tiempo de , sin ejecutarlo nunca.norte

Para todos los demás programas de entrada, devolvería un indicador que indica que no pudo determinar la complejidad temporal.

Mi pregunta es esta:

¿Qué condiciones deben cumplir, de modo que podamos determinar algorítmicamente la complejidad temporal de un programa dado?

* Si hay una referencia canónica o un artículo de revisión sobre esto, agradecería un enlace a él en los comentarios.

Enganchado
fuente
1
(1) “La notación O” no significa “complejidad temporal”. (2) No está claro lo que quiere decir con “O (infinito)”. Evite inventar una nueva notación si es posible. (3) Decidir si un programa determinado se detiene o no y dar un límite superior explícito sobre la complejidad temporal del programa es diferente.
Tsuyoshi Ito
1
No estoy familiarizado con inferir la complejidad del tiempo de los programas en clases restringidas, pero una clase de programas que vale la pena verificar se llama "programas de bucle acotado", para los cuales es fácil limitar la complejidad del tiempo. Recuerdo que Uwe Schöning y Randall J. Pruim discuten los programas de bucle limitado en el Capítulo 3 de Gems of Theoretical Computer Science en el contexto de decidir la equivalencia de dos programas, pero no estoy seguro de qué tan relevante es el capítulo para su pregunta.
Tsuyoshi Ito
44
Estoy un poco confundida. ¿De qué manera está esto fuera de alcance? Una respuesta razonable a la pregunta del OP serían fragmentos de lenguaje (o incluso clases de fragmentos) para los cuales el tiempo de ejecución se puede determinar algorítmicamente.
Suresh Venkat
44
Pregunta relacionada: ¿Los límites de tiempo de ejecución en P son decidibles?
Artem Kaznatcheev
77
Llego terriblemente tarde a este hilo de comentarios. Parece que saltamos en el momento en que una publicación huele a novato. No estoy señalando con el dedo. Siento este instinto yo mismo. Tal vez deberíamos ser más suaves. El OP admitió no estar familiarizado con el área o los términos. ¿Qué sentido tiene un sitio de preguntas y respuestas si solo toleramos a las personas que saben exactamente lo que quieren y lo preguntan en nuestro idioma?
Vijay D

Respuestas:

23

En general, no puede determinar la complejidad, incluso para detener programas: deje que sea ​​una máquina Turing arbitraria y deje que p T sea ​​el programa (que siempre devuelve 0):TpagsT

input: n
run T for n steps
if T is in halting state, output: 0
otherwise, loop for n^2 steps and output: 0

Está claro que, en general, es indecidible si es de tiempo lineal o de tiempo cuadrático.pagsT

Sin embargo, se ha trabajado mucho en el cálculo efectivo de la complejidad del programa. Tengo especial afición por la teoría de la complejidad implícita, que tiene como objetivo crear lenguajes que, utilizando construcciones especiales o disciplinas de tipo, le permitan a uno escribir solo programas que habitan una cierta clase de complejidad bien definida. ¡Por lo que considero un milagro, estos idiomas a menudo están completos para esa clase!

J.-Y. describe en este documento un ejemplo particularmente agradable. Marion, que describe una pequeña lenguaje imperativo, con una disciplina tipo inspirado a partir de técnicas de flujo de información y análisis de seguridad, lo que permite una caracterización de algoritmos en P .

cody
fuente
Como nota al margen, también vea Epigram, que es un lenguaje que puede garantizar la terminación.
Realz Slaw
Este es un buen comienzo, pero ¿hay más que decir? (Por ejemplo, me parece que el tiempo de ejecución de una función recursiva elemental dada debe ser sencillo de calcular, pero tales funciones pueden resolver cualquier problema en la jerarquía exponencial ...)
usul
En la medida en que sea posible determinar que el programa de entrada está escrito en un idioma restringido, puede asumir que la complejidad del tiempo está limitada por cualquier límite superior que imponga ese idioma. Sin embargo, muchas funciones recursivas primitivas tienen equivalentes recursivos generales que son más eficientes
Chris Pressey
1
(accidentalmente guardó ese comentario antes, luego excedió el límite de 5 minutos. La segunda oración debería leerse como sigue :) Sin embargo, los programas en estos idiomas restringidos pueden tener equivalentes en idiomas menos restringidos que son más eficientes (específicamente, muchas funciones recursivas primitivas tienen equivalentes recursivos generales que son más eficientes) que, en la práctica, fomenta el uso de lenguajes irrestrictos y difíciles de analizar.
Chris Pressey
Eso es muy interesante Chris! Tiene una referencia? De hecho, parece contrario a la intuición: habría sospechado que las funciones recursivas primitivas pueden simular funciones recursivas generales para un número dado de pasos, lo que limitaría la aceleración a algún factor constante.
cody
11

La pregunta que plantea y el truco de conteo específico que describe es clásico en el análisis de programas. Existe el problema teórico del análisis de complejidad, y es una manifestación práctica en términos de estimar automáticamente el rendimiento de un fragmento de código. Tal análisis automatizado tiene varias aplicaciones, desde la detección de errores de rendimiento hasta la estimación del costo de algunos cálculos en la nube.

Cody señaló que el problema es indecidible en general. Este problema es más difícil que probar la finalización, porque obtener un límite de complejidad implica que el programa también finalice. Hay dos enfoques para tal problema. Uno es del análisis del programa. La idea de agregar un contador y estimar su valor existe desde los años 70. Esta codificación reduce el problema de determinar el tiempo de ejecución al cálculo de una invariante.

Un segundo enfoque es diseñar un lenguaje de programación que solo admita programas de cierta complejidad limitada. Esta es el área de la complejidad computacional implícita.

Algunas referencias para ambas áreas siguen.

  1. El Proyecto SPEED es una línea específica de trabajo de análisis de programas que se enfoca en cómo encontrar límites en los contadores una vez introducidos en el programa. Los contadores pueden medir el consumo de tiempo o espacio.
  2. Análisis de recursos amortizados multivariados , Jan Hoffman, Klaus Aehlig, Martin Hoffman, ACM TOPLAS 2012
  3. Sobre las propiedades de tasa de crecimiento determinables de los programas imperativos , Amir Ben Amram, Desarrollos en la conformidad computacional implícita 2010. Esta es una hermosa línea de trabajo sobre la complejidad límite de los programas imperativos por restricciones sintácticas.
Vijay D
fuente