¿La complejidad temporal del bucle de media matriz con dos ifs es la misma que la del bucle de matriz completa con una if?

Me gustaría saber si las dos variantes de los ejemplos de código a continuación técnicamente tienen la misma complejidad en tiempo de ejecución.

Por ejemplo (y en aras de hacer un punto, digamos que la longitud de la cadena es un número par):

//counting how many times char 'c' appear in the string s

String s = "ascdwcccdweccaaa"; //the "array", contain char 'c' 6 times

int counter = 0; //times char 'c' appear in the string

for(int i=1; i <= s.length()/2; i++)
    {
    if(s.charAt(i-1) == 'c')
        counter++;
    if(s.charAt(s.length()-i) == 'c')
        counter++;
    }

En comparación con esto ...

for(int i=0; i < s.length(); i++)
    if(s.charAt(i) == 'c')
        counter++;

El primer ejemplo usa el índice para verificar desde el final y el inicio de la matriz hasta que llegue al centro de la matriz (supuestamente O(n/2))

mientras que el segundo ejemplo es verificar estrictamente todos los caracteres de la matriz de principio a fin (supuestamente O(n))

En el primer ejemplo necesito usar dos ifs, mientras que en el segundo ejemplo necesito usar uno if.

¿Son estos dos códigos técnicamente idénticos en su complejidad temporal? (dado el hecho de que uso dos ifscuando solo paso la mitad de la matriz en el primer ejemplo, ¿se "igualan"?)

Respuesta 1

Ambos programas tienen exactamente la misma O(n)complejidad. De hecho O(n/2)es igual a O(n)como es el mismo orden. Pero incluso teniendo eso en cuenta: tiene dos veces menos iteraciones que realizan dos veces más trabajo. Total es lo mismo.

Entonces los programas tienen la misma complejidad. Sin embargo, el primero tiene varias desventajas:

  • es más complejo de leer y menos claro

  • ¿Qué pasa con las matrices con un número impar de elementos?

  • JVM podría hacer algunas optimizaciones elegantes wrt. verificación de límites (la VM puede no verificar los límites todo el tiempo cuando descubre que simplemente está iterando sobre toda la matriz). Usar esta fantasía podría confundir al optimizador.

Dicho esto, hizo que su código fuera más difícil de leer, incorrecto y presumiblemente más lento, al intentar optimizarlo.

Respuesta: 2

O (n) y O (n / 2) tienen la misma tasa de crecimiento (lineal) y, por lo tanto, la misma complejidad temporal.

http://en.wikipedia.org/wiki/Big_O_notation

Respuesta: 3

Tengo una aplicación Groovy que utiliza un panel de desplazamiento creado a través del generador de cambios: BinsicWindow (controlador de def) {controlObject = controller swinger = new SwingBuilder () mainFrame = swinger.frame (...

Cuando GSON deserializa un campo en una clase que tiene el tipo java.util.List, parece favorecer a ArrayList como la implementación de la lista a usar. ¿Hay alguna forma de predeterminarlo para usar LinkedList (que no sea ...

¿Hay alguna forma de escribir un gancho para ejecutar un script de hormiga después de que se complete el inicio de tomcat? Intenté cambiar el startup.bat para invocar el script de hormiga al final, pero la hormiga se invoca antes de ...

Actualmente tengo un problema: quiero cambiar del marco actual a padre. La aplicación tiene muchos marcos internos, por lo que usar driver.switchTo (). DefaultContent () no es el caso. En esta discusión ...