No, su código tiene una complejidad de tiempo de O(2^|<DeltaTime>|)
,
Para una correcta codificación de la hora actual.
Por favor, primero déjame disculparme por mi inglés.
Qué es y cómo funciona Big O en CS
La notación Big O no se utiliza para vincular la entrada de un programa con su tiempo de ejecución .
La notación Big O es, dejando atrás el rigor, una forma de expresar la relación asintótica de dos cantidades .
En el caso del análisis de algoritmos, estas dos cantidades no son la entrada (para lo cual primero se debe tener una función de "medida") y el tiempo de ejecución.
Son la longitud de la codificación de una instancia del problema 1 y una métrica de interés.
Las métricas de uso común son
- El número de pasos necesarios para completar el algoritmo en un modelo de cálculo dado.
- El espacio requerido, si existe tal concepto, por el modelo de computación.
Se asume implícitamente una TM como modelo, de modo que el primer punto se traduce en el número de aplicaciones de la función de transición 2 , es decir, "pasos", y el segundo traduce el número de celdas de cinta diferentes escritas al menos una vez .
¿También a menudo se asume implícitamente que podemos usar una codificación relacionada polinomialmente en lugar de la original, por ejemplo, una función que busca una matriz de principio a fin tiene O(n)
complejidad a pesar del hecho de que una codificación de una instancia de dicha matriz debe tener una longitud de n*b+(n-1)
donde b
es el número (constante) de símbolos de cada elemento. Esto se debe a que b
se considera una constante del modelo de cálculo y, por lo tanto, la expresión anterior y n
son asintóticamente iguales.
Esto también explica por qué un algoritmo como Trial Division es un algoritmo exponencial a pesar de ser esencialmente un for(i=2; i<=sqr(N); i++)
algoritmo similar 3 .
Mira esto .
Esto también significa que la notación O grande puede usar tantos parámetros como sea necesario para describir el problema, ¿no es inusual tener un parámetro k para algunos algoritmos?
Así que no se trata de la "entrada" o de que "no hay entrada".
Estudio de caso ahora
La notación Big O no cuestiona su algoritmo, solo asume que sabe lo que está haciendo. Es esencialmente una herramienta aplicable en todas partes, incluso en algoritmos que pueden ser deliberadamente engañosos (como el suyo).
Para resolver su problema, utilizó la fecha actual y una fecha futura, por lo que deben ser parte del problema de alguna manera; en pocas palabras: son parte de la instancia del problema.
Específicamente la instancia es:
<DeltaTime>
Donde el <>
significa cualquier codificación, no patológica, de elección.
Consulte a continuación para obtener aclaraciones muy importantes .
Entonces, su gran tiempo de complejidad O es justo O(2^|<DeltaTime>|)
, porque realiza una serie de iteraciones que dependen del valor del tiempo actual. No tiene sentido poner otras constantes numéricas ya que la notación asintótica es útil ya que elimina constantes (por ejemplo, el uso de no O(10^|<DeltaTime>|*any_time_unit)
tiene sentido).
Donde esta la parte complicada
Hicimos una suposición importante arriba: que el modelo de cálculo reifica 5 el tiempo, y por tiempo me refiero al tiempo físico (¿real?). No existe tal concepto en el modelo computacional estándar, una MT no conoce el tiempo, vinculamos el tiempo con el número de pasos porque así es como funciona nuestra realidad 4 .
En su modelo, sin embargo, el tiempo es parte del cálculo, puede usar la terminología de personas funcionales diciendo que Main no es puro, pero el concepto es el mismo.
Para entender esto, uno debe tener en cuenta que nada impide que el Framework use un tiempo falso que se ejecuta dos, cinco, diez veces más rápido que el tiempo físico. De esta manera, su código se ejecutará en "la mitad", "una quinta parte", "una décima parte" del "tiempo".
Esta reflexión es importante para elegir la codificación de <DeltaTime>
, esta es esencialmente una forma condensada de escribir <(CurrentTime, TimeInFuture)>. Dado que el tiempo no existe a priori, la codificación de CurrentTime podría muy bien ser la palabra Now (o cualquier otra opción) el día anterior podría codificarse como Yesterday , rompiendo la suposición de que la duración de la codificación aumenta como el tiempo físico avanza (y el de DeltaTime disminuye)
Tenemos que modelar correctamente el tiempo en nuestro modelo computacional para hacer algo útil.
La única opción segura que podemos hacer es codificar marcas de tiempo con longitudes crecientes (pero sin usar unario) a medida que avanza el tiempo físico. Esta es la única propiedad verdadera del tiempo que necesitamos y la que la codificación necesita capturar. Es solo con este tipo de codificación que a su algoritmo se le puede dar una complejidad de tiempo.
Su confusión, si la hay, surge del hecho de que la palabra tiempo en las frases "¿Cuál es su complejidad temporal ?" y '¿Cuánto tiempo llevará?' significa cosas muy muy diferentes
Lamentablemente, la terminología usa las mismas palabras, pero puedes intentar usar "complejidad de pasos" en tu cabeza y volver a hacerte tu pregunta, espero que te ayude a entender que la respuesta realmente es ^ _ ^
1 Esto también explica la necesidad de un enfoque asintótico, ya que cada instancia tiene una longitud diferente, pero no arbitraria.
2 Espero estar usando el término en inglés correcto aquí.
3 También es por eso que a menudo encontramos log(log(n))
términos en matemáticas.
4 Id est, un paso debe ocupar un intervalo de tiempo finito, pero no nulo, ni desconectado.
5 Esto significa que el modo computacional como conocimiento del tiempo físico en él, es decir, puede expresarlo con sus términos. Una analogía es cómo funcionan los genéricos en el marco .NET.
O(N)
complejidad, noO(1)