¿Qué constituye una unidad de tiempo en el análisis de tiempo de ejecución?


8

Al calcular la dependencia del tiempo de ejecución de la entrada, ¿qué cálculos se consideran? Por ejemplo, creo que aprendí que la indexación de matrices y las declaraciones de asignación no se cuentan, ¿por qué es eso?

Respuestas:


6

Cuando hacemos cálculos de complejidad, generalmente usamos el modelo RAM . En este modelo suponemos que la indexación de matriz es O (1). La declaración de asignación es como asignar un valor a algunas variables en una matriz de variables . Esto es solo por conveniencia. Simplifica el análisis del algoritmo. En el mundo real, la indexación de conjuntos requiere O (log I) donde I es el número de cosas indexadas.

Generalmente consideramos cosas que dependen del tamaño de la entrada, por ejemplo, bucles. Incluso si hay una operación O (1) en el ciclo y se ejecuta n veces, el algoritmo se ejecuta durante el tiempo O (n).

Pero la operación O (1) fuera del ciclo toma solo tiempo constante y O (n) + O (1) = O (n).

Lea sobre el algoritmo de clasificación de radix de CLRS.


¿Qué pasa con los incrementos en un bucle? Esos deberían ser O (n) ¿verdad?

for (int k = 0; k <N; k ++) {sum = sum + values ​​[k];} Es el código en cuestión. Se decía que hacía llamadas 3N + 2.

No Para sum = sum + valores [k], + es O (1) y = también es O (1). Pero el ciclo se ejecuta O (N) veces . Entonces es O (N) * O (1 + 1) = O (N). Las llamadas O (3N + 2) son solo O (N).
Pratik Deoghare

Pero, ¿por qué son llamadas O (3N + 2)?

El valor de acceso [k] es 1 llamada. + es 1 llamada. = es 1 llamada. Eso explica 3 llamadas realizadas N veces, pero no sé acerca de +2.
Pratik Deoghare

5

El objetivo final es el "tiempo de ejecución en segundos" o más generalmente (sin tener en cuenta las características modernas de la CPU) "número de ciclos de reloj". Como resultado, esto es difícil de analizar, y también es específico de la máquina o al menos del conjunto de instrucciones. Por lo tanto, generalmente no se hace.

El siguiente nivel de abstracción es contar con precisión todas las operaciones (de algunos pseudocódigos de estilo ensamblador), manteniendo el costo de operación individual (en ciclos de reloj) como parámetros. Tenga en cuenta que dicho análisis se encuentra en "El arte de la programación de computadoras" de Knuth, entre otros, por lo que ciertamente hay un lugar para este tipo de enfoque, a pesar de que es difícil y tiende a ser más difícil en presencia de jerarquía de memoria.

Por último, pero no menos importante, y sin duda el más destacado, es el análisis de las operaciones dominantes que ignoran factores constantes y desaparecen asintóticamente (" análisis"). El razonamiento es que el tiempo de ejecución se comportará asintóticamente como el número de operaciones ejecutadas con mayor frecuencia, multiplicado por algún factor dependiendo de la implementación real y la máquina. Este tipo de análisis arroja resultados generales que se aplican a todas las máquinas (cubiertos por el modelo RAM) y es más fácil de realizar que los anteriores. Sin embargo, puede carecer de especificidad.O

Dejando atrás los marcos "clásicos", muchos algoritmos están dominados por el costo de memoria y / o comunicación, por lo que en ese caso se cuenta el número y el volumen de accesos de memoria resp. Las transmisiones de red son razonables (y tal vez suficientes).

Además, tenga en cuenta que a menudo no estamos tan interesados ​​en el rendimiento absoluto de un algoritmo sino en compararlo con otros. Esto también puede informar la elección del parámetro analizado.

Como puede ver, no hay una respuesta definitiva. Dependiendo de los objetivos del análisis en cuestión, se pueden dar diferentes respuestas.

Vea también mi respuesta aquí para algunos pensamientos relacionados, y la respuesta de Sebastian en Quicksort para un ejemplo.


No me contento con decir que el enfoque más destacado que usted menciona está completamente cubierto por el modelo RAM: el modelo RAM generalmente no tiene en cuenta los costos uniformes de la multiplicación (para retener la equivalencia de problemas solucionables por TM en tiempo polivinílico con problemas solucionable por RAMs en poly-time). Sin embargo, generalmente se supone que la multiplicación cuesta una cantidad constante de tiempo en el análisis de muchos algoritmos
Cornelius Brand

@ cbra: No he encontrado un modelo de RAM con un costo uniforme para todo menos para la multiplicación. En particular, no es necesario para la equivalencia de poli-tiempo.
Raphael

No estoy seguro si lo entendí bien, pero al asignar un costo uniforme a la multiplicación, puede calcular (por lo tanto, almacenar) el número 2(2norte) en O(norte)pasos usando escuadra repetida.
Cornelius Brand

@cbra Parece que tienes un punto allí. El modelo RAM en forma "pura" no ofrece la multiplicación como una acción atómica, sino que la implementa mediante la suma repetida. Por lo tanto, el costo uniforme para la multiplicación (y potencialmente otras operaciones) es "peligroso" ya que rompe ciertas relaciones si se aplica a problemas en los que el número se vuelve grande (es decir, más grande que la entrada (?)).
Raphael
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.