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.
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.
Respuestas:
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 i que está en P . Merge-Sort utiliza ciertos recursos ( O ( n log n )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).
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.