¿Las siguientes declaraciones de bucle en C / C ++ tienen el mismo tiempo de ejecución?

Depende del compilador. Un buen compilador puede convertir algunos cálculos de bucle en el equivalente de una sola declaración. Un compilador podría optimizar el primero pero no el segundo. Por lo tanto, uno no puede responder esto con autoridad en abstracto.

Un compilador no optimizador usaría O (n ^ 2) para el segundo y O (n) para el primero.

Actualización: me perdí por completo el “i * = 2”, que cambia la imagen. Entre otras cosas, un compilador optimizador lo verá como un cambio de bit potencial, como en “i << = 1". Cambia el O (..) según las otras respuestas, pero aún así debe ser optimizable simplemente como un incremento. En cualquier caso, incluso si no se optimiza, el recuento de bucles no excederá el tamaño de palabra del compilador de C (32 o 64 bits, muy probablemente). Con un recuento máximo tan pequeño y con un cuerpo de bucle económico, la diferencia O (…) no tiene sentido en realidad. Por último, si n * n se desborda, todas las apuestas están desactivadas.

¡Por supuesto no!

En el primer caso, el bucle se ejecutará n veces, consumiendo así n unidades de tiempo (siempre que considere que se consume 1 unidad de tiempo al ejecutar el cuerpo del bucle una vez).

A diferencia del primer caso, el segundo cuerpo del bucle se ejecutará n * n veces, es decir, el cuadrado de n veces. ¡Gran diferencia!

Esto es así porque las condiciones de prueba en cualquiera de los bucles son diferentes. El primero se vuelve falso solo después de n ejecuciones, y el segundo después de n * n ejecuciones.

En cualquier condición, el primer bucle tardará menos tiempo en ejecutarse que el segundo. Incluso si n es un número negativo, el primer bucle no se ejecutará y el segundo se ejecutará al menos una vez.

La única situación primordial en este caso es si n = 0, es decir, ninguno de los cuerpos del bucle se ejecuta. Entonces, si ves en esa perspectiva, las dos declaraciones en bucle tardan el mismo tiempo en ejecutarse.

Cheerio!

¡Si! tienen la misma complejidad de tiempo. Si bien eso no es lo mismo que el tiempo de ejecución, a medida que n aumenta, para todos los efectos, es todo el tiempo que debe considerar.

La variable de iteración i se duplica cada vez, entonces

para el 1er ciclo, la complejidad del tiempo es O (logn), y

para el segundo bucle, es O (log (n ^ 2)) que es igual a O (logn).

En lo que respecta a las iteraciones, la segunda se ejecuta dos veces más que la primera.

EDITAR:

Veamos por qué es logn y no n o n ^ 2. Si nos fijamos en la variable de iteración, es

i * = 2 y NO i ++. i se duplica cada vez, por lo que la complejidad del tiempo para ambos será logn, pero no. de iteraciones serán logn para 1st y 2logn para 2nd.

Veamos un ejemplo. Digamos n = 32 (tomar el poder de 2 simplifica la explicación).

1er ciclo, seré 1 2 4 8 16 32.

Segundo bucle, seré 1 2 4 8 16 32 64 128 256 512 1024 (32 * 32).

Entonces no. de iteraciones es 2 veces la primera, pero el orden de crecimiento es el mismo. Cuando hablamos de tiempo de ejecución, generalmente consideramos la complejidad del tiempo porque a medida que n aumenta, el tamaño de entrada del orden de crecimiento es lo que importa. Entonces, en este caso, diría que sí, tienen el mismo tiempo de ejecución. Si quiso decir cuántas veces se ejecuta el ciclo, el tiempo de ejecución del segundo es el doble del primero.

El segundo tendrá el doble de iteraciones que el primero desde
[matemáticas] log_2 (x ^ 2) / log_2 (x) = 2 [/ matemáticas]