2012-03-31 7 views
8

Tengo una pregunta sobre la complejidad del tiempo (notación O grande) para el software Java. ¿Hay alguna manera de calcularlo o probarlo rápidamente (o cualquier sitio web que pueda calcularlo para mí sería bienvenido)? Por ejemplo, me gustaría para comprobar que para el siguiente fragmento de código y posiblemente mejorar así:¿Una herramienta para calcular la complejidad de tiempo del código Java?

int dcount = 24423567; 
     int a = 0; 
     if (dcount == 0){ 
      a = 1; 
     } 

     String ds = Integer.toString(dcount); 
     String[] sa = ds.split("(?<=.)"); 
     HashSet hs = new HashSet(); 
     Collections.addAll(hs, sa); 
     a = hs.size(); 
     if (dcount < 0) 
      a--; 

     System.out.println(a); 
+0

"Complejidad del tiempo" generalmente significa peor complejidad de tiempo de caso. Este problema ha demostrado ser imposible. – emory

+0

Quise decir (gran-O) complejidad. Editará la publicación también. – aretai

+0

Si desea contar dígitos distintos en un número, ese código definitivamente no es una solución óptima tanto en tiempo como en espacio. –

Respuesta

13

Como @emory señaló, es demostrablemente imposible determinar el orden O tiempo de complejidad de una pieza arbitraria de código automáticamente (la prueba es una reducción del Halting Problem). Sin embargo, hay herramientas que pueden intentar medir empíricamente la complejidad de una pieza de código ejecutándola en varias entradas diferentes. Una de esas herramientas se describe en el documento "Measuring Empirical Computational Complexity" de Goldsmith, Aiken y Wilkerson. Funciona al intentar hacer una regresión en el tiempo de ejecución del programa frente a su tamaño de entrada. La herramienta, llamada trend-prof, está disponible en línea.

Espero que esto ayude!

+0

Usted dijo que hay herramientas para medir la complejidad ejecutándola con diferentes entradas. ¿Cómo es eso diferente si un usuario mismo ejecuta su código con diferentes entradas y calcula el tiempo? Ambos darán los mismos resultados? Automático vs Manual? – Faizan

+0

@ Faizan- La herramienta hace mucho más que simplemente ejecutar el programa. Agrega una gran cantidad de instrumentación binaria para medir funciones individuales/bloques de código, y es mucho más fácil que hacerlo a mano. En principio, podría hacer lo mismo manualmente, pero sería * mucho * más difícil. – templatetypedef

+0

@templatetypedef siempre es beneficioso si proporciona el nombre del documento y no solo "en este documento", ya que los enlaces se rompieron con bastante frecuencia. – Vishrant

1

podría estar resolviendo la tarea de alguien, pero la pregunta estaba pidiendo una solución sensata ...

Contando dígitos distintos en un número no requiere de cuerdas, conjuntos o expresiones regulares, sólo algunos aritmética simple.

El siguiente método se ejecuta en tiempo O (n) (n = número de dígitos en la entrada) y espacio constante:

int distinctDigits(int num) { 
    if (num == 0) { 
    return 1; 
    } 

    boolean[] digits = new boolean[10]; 

    while (num > 0) { 
    digits[num % 10] = true; 
    num /= 10; 
    } 

    int count = 0; 
    for (boolean digit : digits) { 
    if (digit) { 
     count++; 
    } 
    } 

    return count; 
} 

Hacer este trabajo para los números negativos se deja como exericse para el lector;)

+0

nah no fue mi tarea gracias. En realidad, también pensé en este enfoque; sin embargo, se pensó que convertir a String y luego usar Set sería más eficiente (complejidad de tiempo). – aretai

+0

Espero que aún encuentres útil esta gota de código :) –

+0

sí, también es una buena solución, gracias. A pesar de que no responde directamente a mi pregunta (como la de arriba), sino 1 voto positivo que tienes. – aretai

Cuestiones relacionadas