problema de explicación de tiempo de ejecución único para bucle


8

Estoy analizando algunos tiempos de ejecución de diferentes bucles for, y a medida que obtengo más conocimiento, tengo curiosidad por comprender este problema que todavía tengo que descubrir. Tengo este ejercicio llamado "Cuántas estrellas están impresas":

for (int i = N; i > 1; i = i/2) System.out.println("*");

Las respuestas para elegir es A: ~log N B: ~N C: ~N log N D: ~0.5N^2

Entonces la respuesta debería ser A y estoy de acuerdo con eso, pero por otro lado ... Digamos N = 500qué sería Log Nentonces. Sería 2.7. Entonces, ¿qué pasa si decimos eso N=500en nuestro ejercicio anterior? ¿Eso definitivamente imprimiría más estrellas han 2.7? ¿Cómo se relaciona eso?

Porque tiene sentido decir que si el ciclo for tuviera este aspecto:

for (int i = 0; i < N; i++)

imprimiría Nestrellas.

Espero encontrar una explicación para esto aquí, tal vez estoy interpretando mal todas estas cosas y pensando mal. Gracias por adelantado.


¿Cómo es esto diferente de su pregunta anterior? Tiempo de ejecución asintótico de bucles for
— mosquito

Esto no tiene nada que ver con los tiempos de ejecución asintóticos.
— owwyess

1
Esa opción solo tiene sentido si se entiende el logaritmo de base 2, no el logaritmo de base 10.
— Kilian Foth

3
¿Qué base estás asumiendo para obtener Log 500 = 2.7? ¿y esa base aparece en algún lugar de su código? Nota: solo eres un factor constante diferente con registros de diferentes bases
— Caleth

2
@Caleth el logaritmo de base no aparecen en el código: i = i/2la base es dos, porque el bucle está revirtiendo multiplicación repetida por dos.

Respuestas:


34

Has pasado por alto la característica clave de la base de logaritmo .

Como ise divide entre 2 en cada iteración, el tiempo de ejecución es logarítmico con la base 2. Y

log 2 (500) ~ 8.9

Lo que estás viendo es

log 10 (500) ~ 2.7

(logaritmo con base 10)

Por cierto, la razón por la cual la base a menudo se omite en las discusiones en tiempo de ejecución (y su calculadora probablemente no tiene un botón para el registro 2 ) es que debido a los mecanismos de las matemáticas logarítmicas, una base diferente corresponde a un factor constante y, por lo tanto, no es relevante cuando ignoras factores constantes de todos modos. Se puede calcular fácilmente:

log a (x) = log b (x) / log b (a)


Esto tiene mucho sentido, por lo que en realidad es solo mi falta de conocimiento sobre los logaritmos. Gracias por la respuesta simple y clara.
— owwyess

Gracias @Michael Borgwardt. Cualquier posibilidad de que pueda dar el ejemplo anterior con N = 500. ¿Cómo puedo calcular eso en una calculadora con solo log base 10?
— owwyess

2
@owwyess divide el resultado log10 por log10 (2)
— ratchet freak

Lo siento, me había confundido y dividido con log10 (10). Gracias a todos.
— owwyess

2
El factor constante mencionado en el último párrafo es aproximadamente 3.322 para la base 2. Es decir, necesita ~ 3.3 dígitos de binario para un dígito de decimal. O si prefieres, un binario de 33 dígitos es ~ 10 dígitos en decimal.
— Capitán Jirafa

8

Además de la respuesta de Michael Borgwardt , el carácter de tilde delante de cada respuesta debe leerse como "proporcional a". Entonces, si dobló N (digamos, de 500 a 1000), vería que el tiempo de ejecución (o, en este caso, el número de estrellas impresas) aumentaría en un factor que sería igual a (log1000 / log 500), que es independiente de la base que usa.


2
Siempre entendí que tilde significa aproximado, no proporcional. Esencialmente, ~es una abreviatura de ≅.
— Davor Ždralo

1
Proporcional a es el ∝símbolo no ~! Se ~utiliza para indicar relaciones de equivalencia o igualdades aproximadas (consulte la página de wikipedia sobre tilde ).
— Bakuriu
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.