Si saco el bucle for más interno de un bucle for anidado y lo ejecuto solo, ¿cambiará la complejidad del tiempo?

En general, la complejidad cambiaría de O (n ^ 2) a O (n), pero de manera crucial, esperaría obtener un resultado diferente .

Por ejemplo, supongamos que tenemos este código:

n = 100
para i en rango (n):
imprimir “hola”
para j en el rango (n):
imprimir “hola”

¿Cuántas veces esperarías ver “hola” impreso en tu pantalla? 100 * 100 + 100 = 10100, ¿verdad?

Ahora, hagamos lo que usted proponga, mueva el bucle interno y haga que se ejecute solo:

n = 100
para i en rango (n):
imprimir “hola”

para j en el rango (n):
imprimir “hola”

Ahora, ¿cuántas veces vemos “hola”? 100 + 100 = 200.

Entonces los resultados son diferentes.

Sin embargo, en la mayoría de los casos, el cálculo interno probablemente sea una función de la variable del bucle interno y la variable del bucle externo. En estos casos, sacar el lazo interno simplemente no tendría ningún sentido.

Por ejemplo:

n = 100

# Versión 1
para i en rango (n):
para j en el rango (n):
hacer algo (i, j)

# Versión 2
para i en rango (n):
pasar

para j en el rango (n):
hacer algo (i, j)

Pero, ¿cuál es exactamente la variable que se supone que soy en la versión 2? No hay una respuesta correcta, por lo que este tipo de técnica no tiene mucho valor para los algoritmos reales.

Como siempre, depende. Sin embargo, si suponemos que el código dentro de cada ciclo se ejecuta en tiempo constante, entonces su tiempo de ejecución cambiará de O (n * m) (NO O (n ^ 2!)) A O (n).

Por supuesto, si el código dentro de los bucles no es constante (¡o no está libre de efectos secundarios significativos!), Entonces todas las apuestas están desactivadas. ¡Diablos, puedo escribir un programa en el que la eliminación del bucle interno hace que el programa se ejecute aún más lentamente!

Lo dejo como un desafío para el lector. 🙂

Gracias por a2a

Pensemos en esto juntos …

Antes de:

por cada 1 bucle del bucle externo hiciste n bucles internos y en total terminas haciendo n bucles externos, por lo que la complejidad es (n * n)

Ahora:

Usted hace un bucle interno por separado

+

Usted hace un bucle externo por separado

¿Ya lo tienes? Házmelo saber en los comentarios…

¡Sigan con el buen trabajo! 🙂

Puede que esté malinterpretando la pregunta, pero en mi opinión, la gran complejidad de O no cambiará, si desea completar la misma tarea. No puedo pensar por qué considerarías mover el bucle interno hacia afuera desde un punto de vista de complejidad, ya que estoy bastante seguro de que siempre terminarías logrando algo completamente diferente (o uno de tus bucles sería completamente inútil). Recorrerás n, y luego tendrás que hacer el mismo bucle anidado, para recorrer los mismos pares ordenados (i, j). Ahora, si por alguna razón solo está tratando de comparar un bucle anidado, con el bucle externo iterando de 1 a n y el bucle interno también iterando de 1 a n, a dos bucles simples iterando de 1 a n, estoy de acuerdo con las otras respuestas que cambiará de n ^ 2 a n.

More Interesting

¿Qué atajos, términos y algoritmos deben saber los programadores junior para progresar?

¿Cuál es la relación entre el análisis probabilístico y el algoritmo aleatorio?

¿Cómo podemos lograr O (nlogn) / O (n) para ThePalindrome (Topcoder SRM 427)?

Hay libros que enseñan estructuras de datos y algoritmos a través de un lenguaje de programación y otros simplemente enseñan la teoría; cual me recomiendan

Dado un volumen que consiste en un número de ubicaciones dentro de un espacio tridimensional definido, y a cada una de estas ubicaciones se le asigna algún número, ¿hay alguna métrica obvia que se pueda aplicar que mida la complejidad de la distribución de las mediciones?

¿Existe un algoritmo eficiente para enumerar todos los ciclos dentro del Componente fuertemente conectado de un gráfico dirigido?

No entiendo las torres recursivas del problema de Hanoi. ¿Qué es?

¿Cuáles son las principales diferencias en términos de definición / idea clave, dominio de aplicación y eficiencia entre árboles de segmento, árboles de intervalo, árboles indexados binarios y árboles de rango?

¿Cuál es un buen algoritmo para priorizar mensajes DENTRO de su bandeja de entrada?

¿Cuáles son los tiempos de ejecución para insertar un elemento en un LinkedList en la cabeza, el final y en algún lugar en el medio?

Cómo calcular coeficientes binomiales para números muy grandes

¿Es la prueba de primalidad Rabin-Miller más rápida que el tamiz de Eratóstenes?

¿Cómo se distribuye el pagerank?

¿Cuál es el mejor algoritmo para encontrar la longitud de la subcadena más larga sin repetir caracteres?

¿Qué idioma es mejor para comprender la importancia de las estructuras de datos?