Considere la siguiente subrutina, ¿cuál es el tiempo de ejecución?

Supongamos que A(.) es una subrutina que toma como entrada un número en binario, y toma el tiempo O( norte 2 ), donde n es la longitud (en bits) del número.

(a) Considere la siguiente pieza de código, que comienza con un número x de n bits.

mientras que x > 1:

llamar A(x)

x = x/2

Suponga que la división por dos toma O(n) tiempo en un número de n bits.

En la primera iteración del ciclo interno, x tiene una longitud de n bits. ¿Cuál es la longitud de x durante la segunda iteración? ¿La tercera iteración?

¿Cuántas veces se ejecuta el ciclo interno? Deje su respuesta en forma de O grande.

¿Cuál es el tiempo total de ejecución (en términos de n)? Nuevamente, use O grande.

¿Es este un algoritmo de tiempo polinomial?

(b) Ahora responda las mismas preguntas para este fragmento de código alternativo.

mientras que x > 1:

llamar A(x)

x = x - 1

Suponga que la operación de resta toma O(n) tiempo en un número de n bits.


SOLUCIÓN

(a) En cada iteración del ciclo interno, x se reduce a la mitad y, por lo tanto, se reduce en un bit. Por lo tanto, hay como máximo n iteraciones. El tiempo total de ejecución es O( norte 2 + ( norte 1 ) 2 + . . . + 1 2 ) = O( norte 3 ), polinomio.

(b) En cada iteración del ciclo interno, x disminuye solo en 1. Por lo tanto, su longitud permanece igual durante aproximadamente 2 norte 1 iteraciones, entonces para 2 norte 2 iteraciones, etc. El tiempo total de ejecución es O( norte 2 2 norte ), exponencial.

en parte, creo que entiendo, acabo de tomar un ejemplo 8 que es 1000 en binario y cada vez que se reduce a la mitad se reduce en un bit de 8 (1000) a 4 (0100) a 2 (0010) a 1 (0001), yo puede ver concretamente el razonamiento detrás de la parte a. La parte B es un poco más confusa. No entiendo cómo se les ocurren las iteraciones y el tiempo de ejecución. ¿Puede alguien explicarme?

Respuestas (1)

Para a, no entiendo elevar al cuadrado la longitud de X . Se le dice que una división es O ( norte ) , por lo que habría dicho norte + ( norte 1 ) + ( norte 2 ) + + 1 = O ( norte 2 ) . Para b, se necesita 2 norte 1 restas para restar un bit X , porque un norte el número de bit tiene su valor de bit más significativo 2 norte 1 y tienes que restarlo. De nuevo, no entiendo el cuadrado en norte , Hubiera dicho norte 2 norte , aunque es un poco más bajo que eso, causado por la reducción del número.

el cuadrado que supongo es porque A(.) en sí mismo toma O( norte 2 ) tiempo. pero nose si eso es correcto. y la parte B no tengo ni idea
Pero A es solo la resta o división, que se da como O(n). El punto de b es que hay exponencialmente muchas carreras a través del ciclo