Diferencia entre complejidad temporal y complejidad computacional

14

Para medir la complejidad de un algoritmo, ¿es la complejidad del tiempo o la complejidad computacional? ¿Cuál es la diferencia entre ellos?

Solía ​​calcular el recuento máximo (peor) de la operación básica (más costosa) en el algoritmo.

Hilal mediana
fuente
2
No es una respuesta a su pregunta, pero dado su interés en este tipo de cosas, también podría estar interesado en cs.stackexchange.com/q/13669/755
DW
1
La "complejidad de un algoritmo" cuando se refiere al tiempo de ejecución asintótico es un nombre inapropiado (de uso frecuente). Quiere decir "tiempo de ejecución asintótico".
Raphael

Respuestas:

9

La complejidad computacional es solo un término más general, ya que el tiempo no es el único recurso que podríamos considerar. El siguiente más obvio es el espacio que utiliza un algoritmo, y por lo tanto podemos hablar sobre la complejidad del espacio , también como parte de la complejidad computacional. De hecho, podemos hacer esto para cualquier medida que le interese usar, por supuesto, algunas medidas son más útiles que otras.

Por lo tanto, contar el número de pasos que toma un algoritmo en el peor de los casos da un límite de complejidad temporal para el problema que resuelve, contando cuánta memoria / cuántas celdas de cinta usa da un límite de complejidad espacial, etc.

Recuerde también que si desea ser estricto, la complejidad se refiere al problema, no al algoritmo, por lo que un problema tiene límites de complejidad, un algoritmo tiene límites de recursos (tiempo de ejecución, uso del espacio ...). Es solo una cuestión de formalidad definitoria, la teoría de la complejidad se ocupa de los problemas. Sí, los algoritmos son una herramienta clave para analizar problemas y la complejidad, y los algoritmos están estrechamente unidos, pero formalmente no diríamos que Merge-Sort (un algoritmo) está en , es el problema de S o r t iPAG que está en P . Merge-Sort utiliza ciertos recursos ( O ( n log n )SortyonortesolPAGO(norteIniciar sesiónnorte)pasos por ejemplo). El límite de recursos y la corrección del algoritmo implican el límite de complejidad (superior) del problema, pero son cosas diferentes. también es T C 0 -completo bajo A C 0 -reducciones, este límite de complejidad solo puede enunciarse realmente para un problema (pero tiene implicaciones algorítmicas).SortyonortesolTC0 0UNC0 0

Luke Mathieson
fuente
@shekharsuman Por problema quiero decir la noción formal de un problema computacional (por ejemplo, k-Vertex Cover), no el significado general. La complejidad computacional es la clasificación de los problemas computacionales, por lo que, en un sentido formal, la complejidad se refiere a lo que podemos decir sobre el problema. Los resultados sobre algoritmos nos dicen cosas sobre la complejidad de los problemas, pero no son en sí mismos resultados de complejidad (pero informalmente hablamos sobre la complejidad de un algoritmo).
Luke Mathieson
1
@shekharsuman el primer párrafo de la página de wikipedia es un resumen bastante bueno.
Luke Mathieson
@Luke Gracias, esto deja las cosas claras. Sin embargo, si puedo usar el modismo "tipo de complejidad más utilizada para evaluar formalmente algoritmos" (aunque sé que esto no es preciso). ¿Cuál sería el tiempo vs computacional? Lo que creo es que, en general, lo más importante es el tiempo, ya que los recursos son más extensibles en algún sentido.
Mediana Hilal
1
@MedianHilal time es de hecho la medida más comúnmente considerada para la complejidad de un problema. El espacio no está muy lejos (al menos por los teóricos de la complejidad y las personas que trabajan con conjuntos de datos muy grandes, menos aún día a día).
Luke Mathieson
-2

La complejidad ciclomática se usa a menudo como medida de la complejidad computacional. Se proporciona un ejemplo útil en /programming/9097987/calculation-of-cyclomatic-complexity

Puede haber muchas rutas diferentes (posiblemente anidadas) a través de un algoritmo que le da una alta complejidad ciclomática, pero ningún bucle le da una baja complejidad de tiempo. Un programa con un solo bucle tendría una baja complejidad ciclomática pero posiblemente una alta complejidad de tiempo.

La complejidad ciclomática se usa a menudo como una medida del mantenimiento requerido para el código. Se proporciona una discusión más detallada en http://docs.sonarqube.org/display/SONAR/Bad+Distribution+of+Complexity . Esto es diferente a la complejidad del tiempo, que es la medición del tiempo de ejecución del código y puede usarse para evaluar la percepción de los usuarios sobre la efectividad del sistema.

pan tostado
fuente
¡La pregunta es sobre la complejidad computacional, no sobre la complejidad ciclomática!
Am_I_Helpful
Es posible que desee leer el OP: está preguntando sobre la complejidad de un algoritmo. La complejidad ciclomática proporciona una medida estática de la complejidad computacional de un algoritmo. Intente agregar comentarios positivos la próxima vez
Velvetytoast
2
La complejidad ciclomática no mide la complejidad computacional. La complejidad computacional se refiere al tiempo de ejecución, no a la complejidad de la estructura del código fuente.
DW
@DW Más exactamente, la complejidad computacional se refiere a los recursos necesarios para resolver un problema (que puede incluir espacio, alternancia, llamadas de oráculo, etc., así como tiempo).
David Richerby
@DavidRicherby No soy un experto en esto, así que corríjalo si está equivocado. Las medidas de complejidad estática, como el tamaño del programa, juegan un papel en alguna situación. Estoy en lo cierto que está más relacionado con la complejidad de Kolmogorov. ¿Sería ese también el caso de la complejidad ciclomática? Un tipo de complejidad para escribir programas o problemas, y el otro para resolverlos o ejecutarlos ... posiblemente una breve aproximación de la situación. No estoy seguro de escribir una pregunta sensata sobre esto.
babou